Jaką miarę zaburzeń należy zastosować podczas analizy Quicksort

9

Próbuję zrozumieć, dlaczego quicksort z użyciem partycji Lomuto i ustalonego elementu przestawnego działa nieprawidłowo, ale ogólnie słabo, na losowo generowanych danych wejściowych. Myślę, że chociaż dane wejściowe są generowane losowo, sekwencje mogą być uporządkowane, ale nie jestem pewien, jak zmierzyć poziom nieporządku w sekwencjach. Myślałem o użyciu liczby inwersji, ale na podstawie tego drugiego pytania zadałem , że nie jest to tak naprawdę dobry miernik w tym przypadku.

Powodem, dla którego podejrzewam, że moje losowe sekwencje mają dużo „porządku”, jest to, że losowe przestawianie rozwiązuje problem z wydajnością. Ale teoretycznie nie powinno być żadnego problemu z wydajnością tych rzekomo „losowych” sekwencji wejściowych.

Robert S. Barnes
źródło
Dobrym miernikiem nieporządku dla tego rodzaju rzeczy jest złożoność Kołmogorowa. Mówi w zasadzie, że ciąg najbardziej nieuporządkowany to ciąg nieściśliwy. Prowadzi to do metody nieściśliwości, która została wykorzystana do takich rzeczy, jak analiza algorytmów sortowania w analizie średnich przypadków i znalezienie związku między analizą średniej i analizy najgorszego przypadku.
Peter
Powinienem zauważyć, że jestem studentem ... Szukałem czegoś bardziej prostego, na przykład jednego ze środków w tym artykule (po prostu nie wiem, który): citeseerx.ist.psu. edu / viewdoc / streszczenie? doi = 10.1.1.45.8017
Robert S. Barnes
Powiązane pytanie .
Raphael
Powinieneś podejrzewać błąd programowy, a nie przypadek przeciwnika. Po prostu posortuj zakodowaną sekwencję liczb całkowitych od 1 do N, aby sprawdzić, czy Twój algorytm sortuje!
Yves Daoust,
@YvesDaoust Nie sądzę, żeby to naprawdę miało znaczenie. Ilość „niemonotoniczności” to tak naprawdę złożoność Kołmogorowa ciągu długościktóry koduje kolejność elementów w sekwencji. Oczywiście, nie jest to obliczalne i musisz myśleć o głębokich ciągach, takich jak pseudolosowe, ale jest to przydatne w tym sensie, że każda miara zaburzenia jest zasadniczo przybliżeniem złożoności Kołmogorowa. I nie trzeba go obliczać, aby to udowodnić. Metodą nieściśliwości pokazano wiele wyników złożoności. logn!
Peter,

Odpowiedzi:

1

Lomuto vs Hoare
Partycja Lomuto cierpi podczas sortowania równych kluczy, podczas gdy partycja Hoare nie.
Oba schematy podziału cierpią jednakowo, gdy stosuje się oś oddaloną od mediany.

Miara nieporządku
Miara nieporządku do wyboru na potrzeby szybkiego sortowania jest prosta.
Odp .: Jak daleko od mediany jest ustalony punkt obrotu w porównaniu do danych losowych?
Jeśli nalegasz na użycie partycji Lomuto i zakładasz, że dozwolone są zduplikowane wartości, musisz dodać następujący test na losowość:
B: Ile jest zduplikowanych elementów w porównaniu z losowym.

Oczywiście głupio jest zakładać, że duplikaty są dozwolone w twoim zestawie danych i nadal oceniać partycję Lomuto, więc prawdopodobnie powinieneś albo wcześniej wyeliminować duplikaty, albo przejść na partycję Hoare lub założyć, że duplikaty są rzadkie.

Oba miary są trywialne do oszacowania za pomocą statystyki.

Możemy wykluczyć dane patologiczne.
Wszelkie inne odchylenia od losowości nie będą miały znaczenia dla celów analizy szybkiego sortowania. Tak długo, jak oś jest blisko mediany, będzie dobrze działać na wszystkich danych, które nie są patologiczne.
Odległość od losowości musiałaby być naprawdę duża, aby mogła być patologicznie szybka, więc możemy to wykluczyć.

Nigdy nie używaj żadnych ustalonych elementów przestawnych w prawdziwym kodzie
Pamiętaj, że jeśli piszesz prawdziwy kod za pomocą ustalonego elementu przestawnego *) (cokolwiek to może być), narażasz się na atak typu „odmowa usługi”, ponieważ osoba atakująca może wstawić wartość patologiczna tylko w tym momencie, dlatego zawsze należy wybrać element losowy jako oś przestawną.

*) lub wiele osi przestawnych, jeśli wybierzesz najlepszą z x osi przestawnych.

Johan
źródło