Это не очень умный алгоритм, но он полиномиальный, и я думаю, что он должен работать. Возьми любой комплект. Для каждого элемента в этом наборе подсчитайте количество оставшихся наборов, которые его не содержат, и запомните, какие наборы содержат его. Выберите элемент с наибольшим количеством и восстановите счет для остальных элементов, игнорируя наборы, в которых отсутствует элемент, который вы только что выбрали. Продолжайте, пока все оставшиеся комплекты не будут исключены из рассмотрения.
Пример: пусть , , и . Тогда мы имеем счетчики , и . Мы выбираем 1, исключая множества и которые его не содержали; повторяя счет, мы имеем и . Мы выбираем 2 в качестве следующего элемента и удаляем из рассмотрения. Теперь мы закончили, и наш набор «отпечатков» - . РЕДАКТИРОВАТЬ: чтобы завершить пример, вы должны получить другие наборы отпечатков пальцев, как ,, 2 } { 3 , 4 } { 6 } { 5 }A={1,2,3}B={2,3,4}C={2,4,6}D={1,3,5}c1=2c2=1c3=1BCc2=1c3=0D{1,2}{3,4}{6} и .{5}
Я не думал об этом много, но интуитивно кажется, что это должно работать. Идея состоит в том, чтобы жадно принять в качестве следующего элемента отпечатка пальца элемент, охватывающий наиболее раскрытые наборы.