Давши набір множин, знайдіть найменший набір (и), що містить щонайменше один елемент з кожного набору


15

З огляду на безліч множин, я хотів би знайти безліч M таке , що кожне безліч S в S містить , щонайменше , один елемент з М . Я також хотів би, щоб M містив якомога менше елементів, але все-таки відповідав цьому критерію, хоча може існувати більше одного найменшого М з цією властивістю (рішення не обов'язково унікальне).SMSSMMM

Як конкретний приклад, припустимо, що множина - це набір національних прапорів, а для кожного прапора S у S елементами є кольори, які використовуються у прапорі цієї нації. У Сполучених Штатах було б S = { r e d , w h i t e , b l u e }, а в Марокко S = { r e d , g r e e n } . Тоді МSSSS={red,white,blue}S={red,green}Mбуде являти собою набір квітів з тим властивістю , що кожен національний прапор використовує принаймні один з кольорів в . ( Олімпійські кольори синій, чорний, червоний, зелений, жовтий і білий - приклад такого М , або, принаймні, були у 1920 році.)MM

Чи існує загальна назва цієї проблеми? Чи існує прийнятий «найкращий» алгоритм пошуку множини ? (Мене більше цікавить саме рішення, ніж оптимізація процесу для складності обчислень.)M


2
Ви можете шукати проблему з обкладинкою ?
Джухо

@Juho Не зовсім. У моєму прикладі проблемою кришки набору було б знайти набір прапорів таким чином, що об'єднання цих прапорів містить усі кольори, які використовуються на всіх прапорах. Навпаки, я шукаю те, що випльовує лише список кольорів, а не список прапорів, і мені не потрібен набір щоб містити всі можливі кольори. Я, однак, обміняюсь цим районом у Вікіпедії, я думаю, що ви мене на правильному шляху. Спасибі! М
бдешам

Відповіді:


13

Проблема - відома NP-повна проблема Hitting Set . Вона тісно пов'язана із Set-Cover . Доказ NP-повноти можна знайти в класичній книзі Гарі та Джонсона .

Якщо ви хочете наблизити його, ви можете спершу перекласти свій примірник у Set-Cover, а потім застосувати алгоритм наближення для Set-Cover. Однак Set-Cover не може бути апроксимований постійним коефіцієнтом у поліноміальний час, якщо тільки P = NP, як показали Лунд та Яннакакіс .

Якщо ви зацікавлені в точних рішеннях, і ваші входи ведуть себе добре, я рекомендую використовувати фіксований параметр . Час виконання тут виражається не тільки у вигляді вхідної довжини n але й у вигляді додаткового параметра k . Якщо час роботи O(f(k)nO(1)) , ми називаємо алгоритм FPT-алгоритмом. Тут f(k) - зростаюча функція. Отже, якщо k є постійним, у нас є багаточастотний алгоритм. Перша глава зкнига Flum та Grohe , пояснює FPT-алгоритм для набору наборів (точніше для набору p карт). Алгоритм легко реалізувати і використовує метод обмежених дерев пошуку. Однак тут потрібно багато місця для пояснення, в основному ви розбиваєте необхідний (?) Брутальний пошук на невеликі шматочки (коли k невеликий).


Спасибі. Чи можете ви надати десь посилання, щоб прочитати про фактичні реалізації? Тобто як я переклав би свою проблему на проблему з накриттям, і як тоді я це вирішував?
бдешам

1
bdesham, подумайте про кожен елемент як про набір множин, до якого він належить. запустіть кришку набору на вході елементів-комплектів. також прочитайте посилання на вікі, пов’язане тут.
Сашо Ніколов

Вас цікавить приблизне рішення, чи ви хочете мати точне рішення?
А.Шульц

Мені б хотілося точного рішення. Набори даних, з якими я працюю, досить малі, і я не думаю, що це має бути проблемою.
бдешам

1
@Keyser: Ви праві. Однак прийнято пов'язувати проблему рішення з відповідною проблемою оптимізації, оскільки вони для проблем, повних NP, тісно пов'язані.
А.Шульц

2

Ідея, яка могла б допомогти: якщо перетин усіх множин у не порожній, то ви можете вибрати будь-який елемент s у перетині та встановити M = { s } . Якщо перетин порожній, знайдіть елемент (колір) c, кількість яких у множинах є максимальним, і замініть всі множини, в яких воно відбувається, синглтон { c } . Продовжуйте робити це, поки кількість присутніх кожного елемента не дорівнює 1, а потім встановіть M на об'єднання решти множин. Наприклад, якщо S - множина потужності деякої множини A, то M = ASсМ={с}c{c}1МSАМ=А. Я, можливо, помиляюся.


2

Погляньте на "Теорію діагностики з перших принципів" Рей Рейтера, де він дає алгоритм обчислення наборів ударів, і цю додаткову примітку "Корекція ..." .

Алгоритм, як правило, відомий як алгоритм "попадання набір дерев набору", знайти його не слід занадто важко. Ви згадали, що не надто цікавились часом виконання, але такі оптимізації, як раннє припинення відділення тощо, дуже важливі для впровадження, а також цікаві :)


2
Чи можете ви підсумувати алгоритм, щоб зробити свою відповідь більш самодостатньою? Посилання можуть і будуть розірвані.
Джухо

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.