Nie można go rozwiązać w czasie dla dowolnej stałej chyba że hipoteza silnego czasu wykładniczego jest fałszywa.O(n2−ϵ)ϵ>0
To znaczy, gdybyśmy mieli taki algorytm, moglibyśmy rozwiązać -zmienną satysfakcję CNF w czasie dla pewnego . Powodem jest to, że możemy podzielić zmienne na dwie równe części i po zmiennych każda. Dla każdej części konstruujemy odpowiednio rodzinę i podzbiorów klauzul w następujący sposób. Do każdego zadania dodajemy podzbiór składający się z klauzul, których przypisanie nie spełnia. Ta konstrukcja działa w czasie .nO((2−ϵ′)n)ϵ′>0P1P2n/2F1F2poly(n)2n/2
Aby zakończyć budowę, zauważamy, że oryginalna instancja CNF ma rozwiązanie, jeśli istnieje podzbiór w który jest rozłączny z jakimś podzbiorem w .F1F2
Dodając dodatkowe elementy do zestawu podstawowego oprócz elementów dla każdej klauzuli, nie jest zbyt trudno osadzić ten problem rozłączności jako kwestię włączenia zestawu. Zasadniczo bierzesz uzupełnienia podzbiorów w . Aby upewnić się, że dwa zestawy w nie są liczone jako włączenie, dodajesz kod z anty-łańcucha do dodatkowych elementów. Inny podzbiór łańcucha (na innych dodatkowych elementach zestawu naziemnego) jest stosowany w podzestawach aby upewnić się, że żadna para podzbiorów z tworzy włączenia. Wreszcie wszystkie zestawy utworzone z zawierają wszystkie elementy anty-łańcuchowych .F1F1F2F2F1F2
To jest pytanie dotyczące zestawu dla podzbiorów na zestawie podstawowym . Argument w zasadzie wraca do wczesnej gazety Ryana Williamsa (nie pamiętam, która).2n/2+1d=poly(n)
Jeśli jesteś zainteresowany zestawem rodzin on=ω(2d/2) , to innym rozwiązaniem koncepcyjnie bardzo podobnym do tego przedstawionego w odpowiedzi Yuvala jest obliczenie transformacji zeta
gdzief:2[d]→R jest funkcją wskaźnika rodziny wejściowej F={S1,S2,…,Sn} . To znaczy, że f(S)=1 jeśli S∈F i f(S)=0 inaczej. Oczywiście istnieją zestawy Si≠Sj w taki sposób, Si⊆Sj wtedy i tylko wtedy, gdyfζ(S)>1 z jakiegośS∈F .
Transformację zeta można obliczyć w czasieO(d2d) przy użyciu algorytmu Yatesa, patrz na przykład TAOCP Knutha, t. 2, pkt 4.6.4. Sam algorytm jest dość prostym programowaniem dynamicznym i można go łatwo zmodyfikować, aby podał przykład dołączonego zestawu, jeśli taki istnieje.
źródło
Problem ten można rozwiązać za pomocą algorytmu szybkiego mnożenia macierzy, a także podejrzewam, że jest on obliczeniowo równoważny mnożeniu macierzy (chociaż nie znam żadnego sposobu, aby to udowodnić, i nie sądzę, aby istniały techniki udowodnienia tego. ). To rozwiązanie miałoby czas działania O (n ^ {2.373}), gdy n = d, oraz inne czasy działania dla innych relacji między d i n.
Oto jak to rozwiązać za pomocą mnożenia macierzy: Piszemy charakterystyczne wektory zbiorów w rzędach macierzy n przez d macierzy A, a wektory charakterystyczne uzupełnień zbiorów w kolumnach reklamy przez n macierzy B. następnie pomnóż A przez B. Przecinające się pary zbiorów to dokładnie położenia produktu A * B, które są równe zero.
Najlepszy czas działania znany z tego problemu można znaleźć w artykule Huanga i Pan na ten temat. Jeśli dobrze pamiętam, kiedy d stanie się wystarczająco duże, czas działania stanie się oczywiście optymalnym O (nd). Dla n = d będziesz mieć czas działania O (n ^ {2.373}). Dla innych relacji nid dostaniesz inne wartości. Jeśli istnieje optymalny algorytm mnożenia macierzy prostokątnej, otrzymasz algorytm z czasem wykonania O (n ^ 2 + nd) dla twojego problemu. Podejrzewam, że nie ma lepszego sposobu na rozwiązanie twojego problemu, ale nie jestem pewien.
To rozwiązanie prawdopodobnie nie ma praktycznego zastosowania, ponieważ stałe tych algorytmów są zbyt duże. Algorytm Strassena może poprawić w stosunku do naiwnego rozwiązania dla rozsądnych wartości ni id, ale nie jestem nawet tego pewien. Jednak problemy, które wydają się tak związane z mnożeniem macierzy, wydają się rzadko mieć algorytmy kombinatoryczne, które są lepsze niż algorytm naiwny (o więcej niż czynniki polilogarytmiczne), więc gdybym musiał zgadywać, zgadłbym, że nie ma dobrego algorytmu dla twojego problemu, który jest znacznie lepszy niż naiwny, z wykorzystaniem współczesnych technik.
źródło
Jeśli to wiemy, że zbiór nie jest antychainem lematu Spernera, więc wersja decyzyjna problemu staje się trywialna. Interesujące może być rozważenie przypadku, w którymnjest bliskie tej wartości.n>(dd/2)≈2dπd/2√ n
Praca Friedguta nad twierdzeniem Erdősa-Ko-Rado pokazuje, że biorąc pod uwagę charakterystyczny wektor rodziny podzbiorów [ m ] , w czasie O ( m 2 m ) można stwierdzić, czy f jest rodziną przecinającą się (co dwa elementy f krzyżować). Mówiąc bardziej ogólnie, jego metoda pozwala obliczyć Σ = ∑ x , y ∈ f S ( x , y ) , gdzie S ( x , y ) ≥ 0f [m] O(m2m) f f
(Nawiasem mówiąc, komentujemy, że jego metoda działa również, jeśli otrzymamy dwie rodziny i jesteśmy zainteresowani Σ = ∑ x ∈ f , y ∈ g S ( x , y ) . W obu przypadkach musimy obliczyć P -skewed transformat Fouriera Walsha z f , g do dowolnego p ∈ ( 0 , 1 / 2 ) , a następnie Σ = Σ x T ( x )f,g Σ=∑x∈f,y∈gS(x,y) p f,g p∈(0,1/2) , gdzieT(x)zależy tylko od masy Hammingax).Σ=∑xT(x)f^(x)g^(x) T(x) x
Jak to wszystko ma się do problemu? Rozważ rodzinę Każdy S i ∪ { x } jest odłączony od każdego ¯ S ı ∪ { a } . Ponieważ S ( x ,
Algorytm działa w czasie , ignorując czynniki wielomianowe w d . Gdy n jest bliskie 2 d , jest to znacznie lepsze niż ˜ O ( n 2 ) . Zasadniczo uzyskujemy poprawę, o ile n = ω ( 2 d / 2 ) .O~(n+2d) d n 2d O~(n2) n=ω(2d/2)
Biorąc pod uwagę, że wiemy, że para spełniających istnieje, jak go znaleźć? Załóżmy, że dzielimy wszystkie zbiory S 1 , … , S n na dwie grupy G 1 , G 2 losowo. Z prawdopodobieństwem w przybliżeniu 1 / 2 , zestawy S i i S J znajdują się w tej samej grupie. Jeśli mamy szczęście, możemy uruchomić nasz algorytm na G 1 i G 2Si⊆Sj S1,…,Sn G1,G2 1/2 Si Sj G1 G2 , znajdź, do którego one należą, i zmniejsz o połowę liczbę zestawów, które musimy wziąć pod uwagę. Jeśli nie, możemy spróbować ponownie. To pokazuje, że przy oczekiwanej liczbie wywołań wyroczni do wersji decyzyjnej możemy faktycznie znaleźć parę spełniającą S i ⊆ S j .O(logn) Si⊆Sj
Możemy również derandomizować algorytm. Bez utraty ogólności załóżmy, że . Na każdym etapie dzielimy zgodnie z każdym z bitów k . Jeden z tych partycji zawsze położy X i Y w tej samej części, chyba że mają przeciwne bieguny; możemy to sprawdzić bezpośrednio, używając tylko operacji O ( n d ) . Daje to deterministyczny algorytm wykorzystujący wywołania O ( log 2 n ) do wersji decyzyjnej.n=2k k x y O(nd) O(log2n)
źródło