Załóżmy, że mamy 10 osób, każda z listą ulubionych książek. Dla danej osoby X chciałbym znaleźć specjalny podzbiór książek X, lubiany tylko przez X, tzn. Nie ma innej osoby, która polubiłaby wszystkie książki w specjalnym podzbiorze X. Uważam ten specjalny podzbiór za unikalny „odcisk palca” dla X.
Byłbym wdzięczny za sugestie dotyczące znalezienia takich zestawów. (Chociaż brzmi to jak zadanie domowe, jest ono związane z problemem w moich badaniach biologicznych, który próbuję rozwiązać.)
algorithms
sets
edron79
źródło
źródło
Odpowiedzi:
Zakładam, że chcesz, aby odcisk palca był jak najmniejszy. To jest to Uderzanie Set Problem: Dla każdej osoby, zrobić listę wszystkich książek lubianych przez X, ale nie przez tę osobę. Następnie celem jest wybranie co najmniej jednej książki z każdej listy. Problem jest trudny dla NP, więc nie można oczekiwać algorytmu, który zawsze rozwiąże go optymalnie w czasie wielomianowym. Chciwy algorytm ma słabą teoretyczną granicę najgorszego przypadku, ale często działa całkiem przyzwoicie w praktyce. Jeśli chcesz rozwiązać go optymalnie, solver do programowania liniowego w liczbach całkowitych powinien być w stanie rozwiązać instancje do 1000, a może 10000 książek. Jeśli podasz więcej szczegółów na temat wielkości i struktury swoich instancji, możemy zasugerować inne podejścia.
źródło
To nie jest szczególnie sprytny algorytm, ale jest wielomianowy i myślę, że powinien działać. Weź dowolny zestaw. Dla każdego elementu w tym zestawie policz liczbę pozostałych zestawów, które go nie zawierają i pamiętaj, które zestawy je zawierają. Wybierz element o największej liczbie i powtórz liczbę pozostałych elementów, ignorując zestawy, w których brakuje elementu, który właśnie wybrałeś. Kontynuuj, dopóki wszystkie pozostałe zestawy nie zostaną uwzględnione.
Nie zastanawiałem się nad tym, ale intuicyjnie wydaje się, że powinno to działać. Chodzi o to, aby łapczywie przyjąć jako następny element zestawu odcisków palców element, który obejmuje najbardziej odkryte zestawy.
źródło
fingerprint books
Pokażę kod Pythona:
Kod drukuje:
źródło
To jest OP (nie zarejestrował się przy pierwszym przesłaniu, więc teraz nie mogę poprawnie skomentować). Dziękuję bardzo za opinie - oryginalne rozwiązanie chciwego algorytmu poprowadziło mnie we właściwym kierunku. Całkowita przestrzeń, nad którą pracuję, dotyczy setek osób i tysiąca „książek” - jeśli jest to wykonalne przy podejściu do programowania liczb całkowitych, chciałbym usłyszeć o tym więcej.
źródło