OK, może się to wydawać pytaniem o pracę domową iw pewnym sensie tak jest. Jako zadanie domowe w klasie algorytmów licencjackich podałem następujący klasyk:
Biorąc pod uwagę nieukierowany wykres , podaj algorytm, który znajdzie cięcie taki sposób, że , gdzie to liczba krawędzi przecinających cięcie. Złożoność czasowa musi wynosić .
Z jakiegoś powodu mam wiele z następujących rozwiązań. Teraz zajmuje zbyt dużo czasu, więc nie jest to kwestia oceniania, ale zainteresowałem się. To „nie wydaje się” poprawne, ale wszystkie moje próby kontrprzykładów zakończyły się niepowodzeniem. Oto on:
- Ustaw
- Niech będzie na wykresie wierzchołkiem o maksymalnym stopniu
- Dodaj do
- Usuń wszystkie krawędzie sąsiadujące z
- Jeśli wróć do 2
Zauważ, że w kroku 5 odnosi się do oryginalnego wykresu. Zauważ też, że gdybyśmy pominęli krok 4, byłoby to oczywiście błędne (na przykład połączenie trójkąta z dwiema izolowanymi krawędziami).
Teraz każdy prosty dowód ma następujący problem - być może podczas dodawania nowego wierzchołka faktycznie usuwamykrawędzie wycięcia podczas dodawania nowych ( nowych krawędzi (gdzie odnosi się do wykresu z usuniętymi krawędziami). Chodzi o to, że jeśli jest to szkodliwe dla naszej sprawy, oznacza to, że ten wierzchołek „kiedyś” miał coraz wyższy stopień, więc „powinien był zostać” wybrany wcześniej.| S | d ( v ) d ( v ) v
Czy to dobrze znane algorytmy? Czy jest na to jakiś prosty kontrprzykład?
Odpowiedzi:
Moje wcześniejsze roszczenie z nie uwzględnia cięcia wielkościn2/4już w wykresie. Wydaje się, że następująca konstrukcja (imperialnie - stworzyłem pytanie na stronie math.stackexchange.com w celu uzyskania dokładnego dowodu) wO(12c+6 n2/4 ułamek.O(1logc)
Algorytm źle działa na połączeniach kilku odłączonych, różnej wielkości kompletnych wykresów. Cały wykres na wierzchołkach oznaczamy jako K n . Rozważ zachowanie algorytmu na K n : wielokrotnie dodaje dowolny wierzchołek jeszcze w S do S - wszystkie takie wierzchołki są identyczne, więc kolejność nie ma znaczenia. Ustawienie liczby wierzchołków jeszcze nie dodanych do S przez algorytm | ˉ S | = k , wielkość nacięcia w tym momencie wynosi k ( n - k ) .n Kn Kn S S S |S¯|=k k(n−k)
Zastanów się, co się stanie, jeśli uruchomimy algorytm na kilku odłączonych grafach ze stałymi x i między 0 a 1. Jeśli k i jest liczbą elementów, które nie są jeszcze w S na i- tym kompletnym grafie, algorytm będzie wielokrotnie dodawał wierzchołkiem do S z pełnego wykresu z najwyżej k I , łamiąc związki dowolnie. Będzie to wywoływać `okrągłe” uzupełnień opartych wierzchołków do S : algorytm dodaje wierzchołek ze wszystkich graf pełny o najwyższym k = k I , a następnie ze wszystkich graf pełny z kKxin xi ki S i S ki S k=ki (zaktualizacją k i po poprzedniej rundzie) i tak dalej. Gdy pełny wykres ma dodany wierzchołek do S w rundzie, będzie to robił dla każdej rundy od tego momentu.ki=k−1 ki S
Niech będzie liczbą kompletnych wykresów. Niech 0 < x i ≤ 1 z 0 ≤ i ≤ c - 1 będzie modyfikatorem wielkości dla i-tego pełnego wykresu. Zamawiamy te modyfikatory wielkości od dużych do małych i ustawiamy x 0 = 1 . Mamy teraz, że jeśli istnieją wykresy c ′ z dokładnie k elementami, które nie zostały jeszcze dodane do S , wówczas wielkość nacięcia w tym czasie wynosi ∑ c ′ - 1 i = 0 k (c 0<xi≤1 0≤i≤c−1 i x0=1 c′ k S . Całkowita liczba krawędzi wynosi | E | = ∑ c - 1 i = 0 x i n ( x i n - 1 )∑c′−1i=0k(xin−k)=kn∑c′−1i=0(xi)−c′k2 .|E|=∑c−1i=0xin(xin−1)2≈n22∑c−1i=0x2i
Zauważ, że jest funkcją kwadratową w k, a zatem ma maksimum. Dlatego będziemy mieli kilka lokalnych maksymalnych cięć. Na przykład, jeśli c = 1, nasze maksymalne cięcie wynosi k = nkn∑c′−1i=0xi−c′k2 k c=1 wielkościn2k=n2 . Mamy zamiar odebraćx1tak, żex1=1/2-ε, co oznacza drugi graf pełny nie będzie zmieniać rozmiar tego lokalnie maksymalnego cięcia przyk=nn24 x1 x1=1/2−ε . Następnie dostać nowy lokalnie maksymalne cięcie przyk=3/8nk=n2 i tak możemy odebrać x 2 = 3 / 8 n - ε " (z ε , ε ' , ε " małych stałych). Będziemy ignorować ε s na chwilę i po prostu założyć możemy odebrać x 1 = 1 / 2 - powinniśmy zapewnić x 1 n = nk=3/8n−ε′ x2=3/8n−ε′′ ε,ε′,ε′′ ε x1=1/2 , ale nie wpłynie to na końcowe wyniki, jeślinjest wystarczająco duże.x1n=n2−1 n
Chcemy znaleźć lokalne maksima naszych cięć. Rozróżniamy do k , uzyskując n ∑ c ′ - 1 i = 0 ( x i ) - 2 c ′ k . Równanie 0 daje k = nkn∑c′−1i=0(xi)−c′k2 k n∑c′−1i=0(xi)−2c′k 0 , co daje cięcie o rozmiarzen2k=n2c′∑c′−1i=0xi .n24c′(∑c′−1i=0xi)2
Pozwolić być k określona w poprzednim ustępie, jeżeli c ' = I . Zapewniamy, że formuła posiada żądając, że X i n < k I - wszystkie graf pełny i ' z I ' > i są wtedy mniejsze niż k í tego lokalnie maksymalnego cięcia, a tym samym nie zwiększają rozmiar cięcia. Oznacza to, że mamy c cięcia w tych k i, które są większe niż wszystkie inne cięcia znalezione przez algorytm.ki k c′=i xin<ki i′ i′>i ki c ki
Wypełniając , otrzymujemy rekurencję x i = 1xin<ki (plus niektóre małe ε ) przy x 0 = 1 . Rozwiązanie tego daje x i = ( 2 ixi=12c′∑c′−1i=0xi ε x0=1 :patrz moje pytanie na stronie math.stackexchange.comdotyczące pochodnej autorstwa @Daniela Fishera. Podłączając to don2xi=(2ii)4i i wykorzystanie naszego wglądu w nawrót daje nam cięcia o rozmiarzen2n24c′(∑c′−1i=0xi)2 . Korzystając zwłaściwości tego centralnego współczynnika dwumianowego, mamylimc′→∞c′( ( 2 c ′n24c′(2c′(2c′c′)4c′)2=n2c′((2c′c′)4c′)2 (zobacz takżemoje pytanie na stronie math.stackexchange.com).limc′→∞c′((2c′c′)4c′)2=1π
Liczba krawędzi wynosi około . Według znanych właściwościmamy1n22∑c−1i=0x2i=n22∑c−1i=0((2ii)4i)2 . Wpisanie daje co najmniejn214i√≤(2ii)4i który jest asymptotycznien2n22∑c−1i=0(14i√)2=n28∑c−1i=01i jakocidzie do nieskończoności.n28logc c
Mamy zatem jest asymptotycznie równy8δ(S,S¯)|E| jakocprzechodzi w nieskończoność, pokazując, że algorytm może zwracać cięcia, które są dowolnie małymi ułamkami| E| .8πlogc c |E|
źródło
Po chwili namysłu i zadawania pytań, oto przykład, dzięki uprzejmości Ami Paz :
Niech będzie parzyste, a G będzie wykresem będącym sumą K n z dopasowaniem n +n G Kn wierzchołków (to znaczy dopasowaniem z n / 2 + 1 krawędziami).n+2 n/2+1
Jak działa algorytm na tym wykresie? Po prostu pobiera wierzchołki z części kliki w dowolnej kolejności. Po pobraniu wierzchołków z kliki nacięcie ma rozmiar k ⋅ ( n - k ) . Jest to maksymalne dla k = n / 2 , co daje cięcie o rozmiarze n 2k k⋅(n−k) k=n/2 , podczas gdy liczba krawędzi na wykresie wynosin2n24 .n22+1
Algorytm zgodnie z zaleceniami będzie kontynuował dodawanie wierzchołków z kliki, zmniejszając liczbę krawędzi przecinających nacięcie, aż pozostała z kliki będzie tylko pojedynczą krawędzią. W tym momencie nie może uzyskać niczego lepszego niż .n2+2
źródło