Algorytm wyszukiwania podzbioru

9

Załóżmy, że mam listę X podzbiorów {1,...,n}. W razie potrzeby mogę wykonać wstępne przetwarzanie na tej liście. Po tym wstępnym przetwarzaniu otrzymuję kolejny zestawA{1,...,n}. Chcę zidentyfikować żadnych zestawów z .BXBA

Oczywisty algorytm (bez wstępnego przetwarzania) wymaga czasu - po prostu testujesz dla każdego osobno. Czy jest coś lepszego niż to?O(n|X|)ABX

Jeśli to pomoże, możesz założyć, że dla dowolnego całkowita liczba dopasowań jest ograniczona przez coś takiego jak .ABXO(1)

David Harris
źródło

Odpowiedzi:

3

To nie jest odpowiedź. To prosta, ale długa obserwacja. Mam nadzieję, że się przyda.

Wersja decyzyjna twojego problemu to: Tak X zawierają podzbiór A?

Problem ten związany jest z problemem oceny monotonicznych funkcji boolowskich nzmienne. Podzbiór{1,,n} jest równoważne z n-bitstring, więc rodzina X jest równoważne funkcji boolowskiej f z nzmienne. Biorąc pod uwagę funkcjęf, można zdefiniować najmniej monotoniczną funkcję, która nie jest większa niż f, mianowicie g(y)=(xy,f(x)). Pierwotny problem sprowadza się następnie do ocenyg(A). I odwrotnie, problem oceny monotonicznej funkcji boolowskiej można sprowadzić do pierwotnego problemu, albo naiwnie, przyjmującf=g lub wybierając f sprawia, że X mniejszy.

W praktyce dyski BDD zwykle działają dobrze. Jednym z możliwych podejść jest zbudowanie BDDf, pochodzą z niego BDD dla g, a następnie oceń g. Średnia wielkość BDD dlag musi być Ω((nn/2)), ponieważ istnieje wiele monotonicznych funkcji boolowskich . Stąd teoretycznie jest to złe rozwiązanie.

Ale (1) możliwa jest lepsza analiza i (2) mogą istnieć poprawki w tym podejściu, które czynią go lepszym. Na przykład nie użyłem w żaden sposób korelacji między wielkościąX i rozmiar gBDD. (Musi istnieć korelacja, ale nie wiem, czy jest tutaj prosta czy użyteczna).

Dla kompletności, prosty algorytm obliczania BDD dla g z BDD dla f jest następujący.

m(x?fa1:fa0)=x?(m(fa0)m(fa1)):m(fa0)
Tutaj jest standardową operacją na dyskach BDD.
Radu GRIGore
źródło
2
Czy to nie jest mniej więcej równoznaczne z wstępnym obliczeniem odpowiedzi dla każdego podzbioru {1,2,...,n}, buforowanie wszystkich wyników w binarnym drzewie wielkości 2n, a następnie szukając właściwego wyniku (na czas O(n)) po otrzymaniu ZA?
mjqxxxx
Używanie wykładniczej przestrzeni do przechowywania wstępnie przetworzonych danych brzmi dla mnie jak oszustwo, chociaż nie jest to zabronione w pytaniu. Ale mogę być stronniczy w stosunku do Kościoła o największej złożoności.
Tsuyoshi Ito
mjqxxxx i Tsuyoshi: Zgadzam się z oboje. Przepisałem tekst tak, aby, mam nadzieję, wyraźniej wyrazić zgodę. :)
Radu GRIGore
3

Być może możesz użyć techniki „wyszukiwania informacji”: w fazie przetwarzania wstępnego zbuduj odwrócony indeks (w twoim przypadku prostyn×|X| wystarczy tablica dwuwymiarowa), która odwzorowuje element xja{1,...,n} do zbiorów w X które go zawierają: inv(xi)={XjX|xiXj}.

Skonfiguruj tablicę liczb całkowitych occ długości |X|.

Następnie dla każdego yiA odzyskać inv(yi)i dla każdego Xjinv(yi) zrobić occ[j]=occ[j]+1

Na koniec potrzebne są zestawy, dla których |Xj|=occ[j].

Możesz dowolnie przyspieszyć proces (kosztem przestrzeni wykładniczej), indeksując dwa lub więcej elementów razem.

Marzio De Biasi
źródło