Załóżmy, że mamy skończony zbiór dysków w , i chcemy obliczyć najmniejszą dysku , dla którego . Standardowy sposób ten jest użycie algorytmu Matousek, Sharir i Welzl [1], aby znaleźć podstawę z i pozwolić najmniejsza dysku zawierającej . Dysk może być obliczany algebraicznie wykorzystując fakt, że od to podstawa, każdy dysk w jest styczny do .
( jest podstawa z , jeśli jest minimalny, tak że podstawę, ma najwyżej trzy elementy, na ogół w kulki w podstawa ma co najwyżej . Elementy)
Jest to randomizowany algorytm rekurencyjny w następujący sposób. (Ale zobacz poniżej iteracyjną wersję, która może być łatwiejsza do zrozumienia.)
Procedura :
wejściowe : Skończone zestawy dysków , , gdzie jest podstawą ( ).
- Jeśli , zwróć .
- W przeciwnym razie wybierz losowo.
- Niech .
- Jeżeli następnie powrócić B ' .
- W przeciwnym przypadku powrót , w którym B " stanowi podstawę B ' ∪ { X } .
Używane jako do obliczenia podstawy L .
Ostatnio miałem powód do implementacji tego algorytmu. Po sprawdzeniu, że wyniki były prawidłowe w milionach losowo wygenerowanych przypadków testowych, zauważyłem, że popełniłem błąd przy implementacji. W ostatnim kroku zwracałem zamiast M S W ( L , B ″ ) .
Pomimo tego błędu algorytm dawał prawidłowe odpowiedzi.
Moje pytanie: Dlaczego ta nieprawidłowa wersja algorytmu najwyraźniej podaje tutaj prawidłowe odpowiedzi? Czy to zawsze (możliwe) działa? Jeśli tak, to czy dotyczy to również wyższych wymiarów?
Dodano: niektóre nieporozumienia
Kilka osób zaproponowało niepoprawne argumenty, że zmodyfikowany algorytm jest trywialnie poprawny, więc może być przydatne zapobieganie niektórym nieporozumieniom. Jednym z popularnych fałszywe przekonanie, wydaje się, że . Oto kontrprzykład na to twierdzenie. Biorąc pod uwagę, tarcz z , b , c , d , e , jak poniżej (granica ⟨ , b , e ⟩ również pokazano na czerwono):
możemy mieć ; i pamiętać, że e ∉ ⟨ c , d ⟩ :
Oto jak to się może stać. Pierwsza obserwacja jest taka, że :
- Chcemy obliczyć
- Wybierz
- Niech
- Zauważmy, że
- Niech więc będzie podstawą B ′ ∪ { X } = { a , b , c , e }
- Zauważ, że
- Zwróć , czyli { b , c }
Rozważmy teraz .
- Chcemy obliczyć
- Wybierz
- Niech
- Zauważmy, że
- Niech więc będzie podstawą B ′ ∪ { X } = { b , c , d }
- Zauważ, że
- Zwróć , czyli { c , d }
(W celu określenia, powiedzmy, że wszystkie dyski mają promień 2 i są wyśrodkowane na ( 30 , 5 ) , ( 30 , 35 ) , ( 10 , 5 ) , ( Odpowiednio 60 , 26 ) i ( 5 , 26 ) .)
Dodano: prezentacja iteracyjna
Łatwiej pomyśleć o iteracyjnej prezentacji algorytmu. Z pewnością łatwiej mi sobie wyobrazić jego zachowanie.
Dane wejściowe : lista dysków Dane wyjściowe : podstawa L
- Niech .
- Losuj losowy.
- Dla każdego w L :
- Jeśli :
- Niech będzie podstawą B ∪ { X } .
- Wróć do kroku 2.
- Powrót .
Powodem, dla którego kończy algorytm, nawiasem mówiąc, jest to, że krok 5 zawsze zwiększa promień - i istnieje tylko skończenie wiele możliwych wartości B .
O ile mi wiadomo, zmodyfikowana wersja nie ma tak prostej iteracyjnej prezentacji. (Próbowałem podać jedną w poprzedniej edycji tego postu, ale było to złe - i dałem nieprawidłowe wyniki).
Odniesienie
[1] Jiří Matoušek, Micha Sharir i Emo Welzl. Podwykładnicza granica programowania liniowego. Al Algorytmica, 16 (4-5): 498–516, 1996.