Скажем, у нас есть 10 людей, каждый из которых со списком любимых книг. Для данного лица X, я хотел бы найти особое подмножество книг иксов понравившихся только X, т.е. нет другого человека, который любит все книги в специальном подмножестве Х. Я думаю, что этого специального подмножества в качестве уникального «отпечатка пальца» для X.
Буду признателен за предложения о подходе для поиска таких наборов. (Хотя это выглядит как проблема с домашней работой, это связано с проблемой в моем исследовании биологии, которую я пытаюсь решить.)
algorithms
sets
edron79
источник
источник
Ответы:
Я предполагаю, что вы хотите, чтобы отпечаток был как можно меньше. Тогда это проблема набора ударов : для каждого человека составьте список всех книг, которые понравились Х, но не этому человеку. Затем цель состоит в том, чтобы выбрать хотя бы одну книгу из каждого списка. Проблема NP-сложна, поэтому вы не можете ожидать найти алгоритм, который всегда решает ее оптимально за полиномиальное время. Жадный алгоритм имеет плохую теоретическую оценку для наихудшего случая, но на практике часто работает вполне прилично. Если вы хотите решить ее оптимально, решатель целочисленного линейного программирования должен уметь обрабатывать до 1000 или, возможно, 10000 книг. Если вы предоставите более подробную информацию о размере и структуре ваших экземпляров, мы могли бы предложить другие подходы.
источник
Это не очень умный алгоритм, но он полиномиальный, и я думаю, что он должен работать. Возьми любой комплект. Для каждого элемента в этом наборе подсчитайте количество оставшихся наборов, которые его не содержат, и запомните, какие наборы содержат его. Выберите элемент с наибольшим количеством и восстановите счет для остальных элементов, игнорируя наборы, в которых отсутствует элемент, который вы только что выбрали. Продолжайте, пока все оставшиеся комплекты не будут исключены из рассмотрения.
Пример: пусть , , и . Тогда мы имеем счетчики , и . Мы выбираем 1, исключая множества и которые его не содержали; повторяя счет, мы имеем и . Мы выбираем 2 в качестве следующего элемента и удаляем из рассмотрения. Теперь мы закончили, и наш набор «отпечатков» - . РЕДАКТИРОВАТЬ: чтобы завершить пример, вы должны получить другие наборы отпечатков пальцев, как ,, 2 } { 3 , 4 } { 6 } { 5 }A={1,2,3} B={2,3,4} C={2,4,6} D={1,3,5} c1=2 c2=1 c3=1 B C c2=1 c3=0 D {1,2} {3,4} {6} и .{5}
Я не думал об этом много, но интуитивно кажется, что это должно работать. Идея состоит в том, чтобы жадно принять в качестве следующего элемента отпечатка пальца элемент, охватывающий наиболее раскрытые наборы.
источник
Может быть, я не правильно понял вопрос (основываясь на несколько сложных ответах), но здесь идет речь. Вы просто просматриваете всех людей и все их книги, которые им нравятся. Вы создаете структуру данных (предпочтительно Hash Map ), где ключ - это книга, а значение - это список людей, которым нравится эта книга. Вы заполняете эту структуру данных интуитивно понятным способом (для каждой пары человек / книга вы добавляете человека в список ). Затем вы пролистываете ключи карты, и если длина списка равна единице, то эта книга относится к этой конкретной личности.M [ b o o k ]M M[book]
fingerprint books
Позвольте мне продемонстрировать на коде Python:
Код печатает:
источник
Это ОП (не регистрировался при первоначальном представлении, поэтому теперь я не могу правильно комментировать). Большое спасибо за обратную связь - оригинальное жадное алгоритмическое решение заставило меня двигаться в правильном направлении. Общее пространство, над которым я работаю, касается сотен человек и тысяч «книг» - если это возможно с помощью целочисленного программирования, я хотел бы услышать больше об этом.
источник