Zainspirowane tym pytaniem, w którym pytający chce wiedzieć, czy czas działania zmienia się, gdy komparator użyty w standardowym algorytmie wyszukiwania zostaje zastąpiony uczciwym rzucie monetą, a także wyraźnym niepowodzeniem Microsoftu w napisaniu jednolitego generatora permutacji, moje pytanie jest zatem :
Czy istnieje algorytm sortowania oparty na porównaniu, który w zależności od naszej implementacji komparatora:
- zwracaj elementy w posortowanej kolejności, gdy używasz prawdziwego komparatora (tzn. porównanie robi to, czego oczekujemy od standardowego algorytmu sortowania)
- zwraca jednolicie losową permutację pierwiastków, gdy komparator jest zastąpiony przez uczciwą rzut monetą (tzn. zwraca
x < y = true
z prawdopodobieństwem 1/2, niezależnie od wartości x i y)
Kod algorytmu sortowania musi być taki sam. Tylko kod w „czarnej skrzynce” porównania może ulec zmianie.
Odpowiedzi:
Poniższy algorytm deterministyczny (bez komparatora) działa dla krotki wejściowej :(za1, ... ,zan)
Biorąc pod uwagę deterministyczną relację porządku jako komparator, ten algorytm sortuje tablicę w czasie ponieważ losowanie Fisher-Yates działa w przy użyciu maximal nielosowe „losowe bity” (np. wywołania do twojego komparatora) na każdym kroku i sortowanie według scalania ma tę samą asymptotyczną złożoność. Wynik (1) jest w tym przypadku całkowicie bezużyteczny, ale ponieważ następuje po nim prawdziwy rodzaj, nie szkodzi.O (nlogn ) O (n) O (logn )
Biorąc pod uwagę prawdziwy rzut monetą, ponieważ komparator (1) permutuje tablicę z jednakowym prawdopodobieństwem dla każdej permutacji, a jeśli naprawdę musisz zrobić (3) (pominąłeś (2) lub (2) nie udało się ustalić losowości), to nie jest szkoda, ponieważ rozkład jego wyniku zależy tylko od kolejności jego wejścia, która jest równomiernie rozłożona między wszystkimi permutacjami z powodu (1), więc wynik całego algorytmu jest również równomiernie rozłożony. Liczba powtórzeń każdego próbkowania akceptacji-odrzucenia jest rozkładem geometrycznym (odrzucenie z prawdopodobieństwem ), a zatem ma wartość oczekiwaną . Każde powtórzenie wykorzystuje maksymalnie bitów, więc analiza czasu wykonywania jest prawie taka sama jak w przypadku deterministycznym, ale otrzymujemy tylko<12) < 2 logn oczekiwany czas działania , z możliwością nieterminacji (kończy się prawie na pewno ).O (nlogn )
Jak wskazał Joe: Jeśli nie podoba ci się test dla pierwszego bitu w (1), zrób (3), a następnie (1) i użyj który zawsze wynosi , ponieważ tablica jest już posortowana w przypadku deterministycznym . Dodatkowo musisz odjąć swoją liczbę losową od górnej granicy zakresu w pętli, ponieważ górna granica liczby losowej daje identyczną permutację. Pamiętaj jednak, że (2) jest wtedy zabronione, ponieważ zawsze musisz wykonać losowanie w przypadku okupu.zan<za1 0
Możesz nawet użyć tych samych wywołań do komparatora dla (1) i (3), ale udowodnienie, że wynik jest równomiernie rozłożony, jest co najmniej o wiele trudniejsze, o ile w ogóle możliwe.
Poniższy algorytm nie ma odrębnych faz do losowego sortowania i sortowania, ale jest asymptotycznie wolniejszy. Jest to w zasadzie sortowanie przez wstawianie z wyszukiwaniem binarnym . Będzie używać do oznaczenia wejściowe i dla określenia rezultatu po -tym etap:
Przypadek losowy: 5 + klauzula if z 6 jest w zasadzie próbką akceptacji-odrzucenia. Reszta algorytmu jest naiwnym tasowaniem: przetasuj pierwsze elementy i dodaj ty element do każdej pozycji z jednakowym prawdopodobieństwem. Gdybyśmy użyli normalnego sortowania wstawiania, otrzymalibyśmy zamiast tego rozkład dwumianowy.k - 1 k
Zauważ, że ten algorytm jest nieefektywny w obu trybach w porównaniu do sortowania i łączenia przez Fisher-Yatesa, ponieważ wstawianie elementu do dowolnej pozycji jest kosztowne, jeśli użycie tablicy i wyszukiwanie binarne wymaga czasu liniowego, jeśli używasz listy. Ale być może modyfikacja sortowania sterty lub sortowania drzewa w podobny sposób może prowadzić do szybszego algorytmu.
źródło
Nie, jest to niemożliwe, chyba że . Prawdopodobieństwo, że algorytm generujący permutację jest generowany za pomocą losowego komparatora, ma charakter dyadyczny, tzn. Ma postać , natomiast prawdopodobieństwo powinno wynosić. Gdy , nie ma sposobu na napisanieW formie .n ≤ 2 A /2)b 1 / n ! n > 2 1 / n ! A /2)b
źródło