Moi współpracownicy zabrali mnie w czasie do moich dni na uniwersytecie, omawiając dziś rano algorytmy sortowania. Wspominaliśmy nasze ulubione, takie jak StupidSort , i jeden z nas był pewien, że widzieliśmy algorytm sortowania O(n!)
. To sprawiło, że zacząłem rozglądać się za „najgorszymi” algorytmami sortowania, jakie udało mi się znaleźć.
Postulowaliśmy, że całkowicie losowe sortowanie byłoby całkiem złe (tj. Losowanie elementów - czy jest w porządku? Nie? Losowanie ponownie), a ja rozejrzałem się i odkryłem, że najwyraźniej nazywa się to BogoSort lub Monkey Sort, a czasem po prostu losowe sortowanie .
Wydaje się, że Monkey Sort ma najgorszy przypadek O(∞)
, najlepszy przypadek O(n)
i średnią wydajność O(n·n!)
.
Jaki jest obecnie oficjalnie akceptowany algorytm sortowania z najgorszą średnią wydajnością sortowania (a zatem gorszą niż O(n·n!)
)?
Odpowiedzi:
Ze strony Esoteric Algorithms Davida Morgana-Mara : Inteligentne sortowanie projektów
źródło
void quantum_sort (void *b, size_t n, size_t s, int (*c)(const void *, const void*)) { if (rand () % 2) qsort (b, n, s, c); }
."This is the best of all posibble worlds because it is the world that is, and so in the best possible world the array would already be sorted!"
Wiele lat temu wynalazłem (ale nigdy nie wdrożyłem) MiracleSort.
Ostatecznie cząstki alfa przerzucające bity w układach pamięci powinny skutkować pomyślnym sortowaniem.
Aby uzyskać większą niezawodność, skopiuj macierz do chronionej lokalizacji i porównaj potencjalnie posortowane tablice z oryginałem.
Jak więc porównać potencjalnie posortowaną tablicę z oryginałem? Po prostu sortujesz każdą tablicę i sprawdzasz, czy pasuje. MiracleSort jest oczywistym algorytmem do użycia w tym kroku.
EDYCJA: Ściśle mówiąc, to nie jest algorytm, ponieważ nie ma gwarancji zakończenia. Czy „nie algorytm” kwalifikuje się jako „gorszy algorytm”?
źródło
O(2^N)
?Quantum Bogosort
Algorytm sortowania, który zakłada, że wieloświatowa interpretacja mechaniki kwantowej jest poprawna:
Na zakończenie algorytmu lista zostanie posortowana w jedynym pozostałym wszechświecie. Algorytm ten wymaga czasu dla najgorszego przypadku O (N) i średniego przypadku O (1). W rzeczywistości średnia liczba wykonanych porównań wynosi 2: istnieje 50% szans, że wszechświat zostanie zniszczony na drugim elemencie, 25% szans, że zostanie zniszczony na trzecim i tak dalej.
źródło
Dziwię się, że nikt jeszcze nie wspomniał o sleepsort ... Czy nie zauważyłem tego? Tak czy siak:
przykład użycia:
Pod względem wydajności jest to okropne (zwłaszcza drugi przykład). Czekanie prawie 3,5 miesiąca na sortowanie 2 liczb jest trochę złe.
źródło
O(N)
porządek, ale w rzeczywistości jest ograniczony jednak narzędziach OS timerów.sleep "$1"
abysleep "0.$(printf "%010d" $1)"
znacznie poprawić wydajność.time ./sleepsort.sh 8864569 7
następnie działa w 0,009 s na moim laptopie.Jingle Sort, jak opisano tutaj .
W Boże Narodzenie każdą wartość z listy podajesz innemu dziecku. Dzieci, będąc okropnymi istotami ludzkimi, porównają wartość swoich darów i odpowiednio się uporządkują.
źródło
Miałem wykładowcę, który kiedyś zasugerował wygenerowanie losowej tablicy, sprawdzenie, czy została posortowana, a następnie sprawdzenie, czy dane są takie same jak tablica do posortowania.
Najlepszy przypadek O (N) (pierwszy raz dziecko!) Najgorszy przypadek O (nigdy)
źródło
Jeśli w jakikolwiek sposób utrzymasz znaczenie algorytmu,
O(n!)
jest to najgorsza górna granica, jaką możesz osiągnąć.Ponieważ sprawdzenie każdej możliwości posortowania permutacji zestawu będzie wymagało pewnych
n!
kroków, nie możesz być gorszy.Jeśli wykonujesz więcej kroków niż to, algorytm nie ma żadnego użytecznego celu. Nie wspominając o następującym prostym algorytmie sortowania z
O(infinity)
:źródło
Bogobogosort. Tak, to jest rzecz. do Bogobogosort, Ty Bogosort pierwszy element. Sprawdź, czy ten jeden element jest posortowany. Będąc jednym elementem, będzie. Następnie dodajesz drugi element i Bogosortuj te dwa, aż zostaną posortowane. Następnie dodajesz jeszcze jeden element, a następnie Bogosort. Kontynuuj dodawanie elementów i Bogosortowanie, aż w końcu wykonasz każdy element. Miało to nigdy nie udać się z żadną pokaźną listą przed śmiercią wszechświata.
źródło
Powinieneś zbadać ekscytującą dziedzinę algorytmów pesymalnych i analizy prostoty . Autorzy ci zajmują się problemem opracowania sortowania z pesymalnym najlepszym przypadkiem (najlepszym przypadkiem twojego bogosortu jest Omega (n), podczas gdy spowolnienie sortowania (patrz artykuł) ma nie wielomianową złożoność najlepszego przypadku).
źródło
Istnieje rodzaj, który nazywa się bogobogosort. Najpierw sprawdza pierwsze 2 elementy i bogosortuje je. Następnie sprawdza pierwsze 3, bogosortuje i tak dalej.
Gdyby lista była w jakimkolwiek momencie nieuporządkowana, jest ona uruchamiana ponownie przez ponowne bogosortowanie pierwszych 2. Zwykły bogosort ma średnią złożoność wynoszącą
O(N!)
, ten algorytm ma średnią złożoność wynoszącąO(N!1!2!3!...N!)
Edycja : Aby dać ci wyobrażenie o tym, jak duża jest ta liczba, w przypadku
20
pierwiastków ten algorytm zajmuje średnio3.930093*10^158
lata , znacznie powyżej proponowanej śmierci cieplnej wszechświata (jeśli tak się stanie)10^100
lat ,podczas gdy sortowanie przez scalanie zajmuje około
.0000004
sekund , sortowanie bąbelkowe.0000016
sekund , a bogosort zajmuje308
lata ,139
dni ,19
godziny ,35
minuty ,22.306
sekundy , zakładając, że rok to 365,242 dni, a komputer wykonuje 250 000 000 32-bitowych operacji na liczbach całkowitych na sekundę.Edit2 : Ten algorytm nie jest tak powolny jak cudowne sortowanie "algorytmem", które prawdopodobnie, podobnie jak ten rodzaj, spowoduje, że komputer zostanie wessany do czarnej dziury, zanim pomyślnie sortuje 20 elementów, ale gdyby tak było, oszacowałbym średnią złożoność od
2^(32(the number of bits in a 32 bit integer)*N)(the number of elements)*(a number <=10^40)
lat ,ponieważ grawitacja przyspiesza ruchy alfa chipów, a istnieją stany 2 ^ N
2^640*10^40
, czyli około5.783*10^216.762162762
lat , chociaż gdyby lista zaczęła się posortowana, jej złożoność byłaby tylkoO(N)
szybsza niż sortowanie przez scalanie, które wynosi tylko N log N nawet w najgorszym przypadku.Edit3 : Ten algorytm jest w rzeczywistości wolniejszy niż sortowanie cudowne, ponieważ rozmiar staje się bardzo duży, powiedzmy 1000, ponieważ mój algorytm miałby czas działania
2.83*10^1175546
lat , podczas gdy algorytm cudownego sortowania miałby czas działania1.156*10^9657
lat .źródło
Oto dwa rodzaje, które wymyśliłem z moim współlokatorem na studiach
1) Sprawdź kolejność 2) Może zdarzył się cud, przejdź do 1
i
1) sprawdź, czy jest w porządku, jeśli nie 2) umieść każdy element w pakiecie i odbij go od odległego serwera z powrotem do siebie. Niektóre z tych pakietów powrócą w innej kolejności, więc przejdź do 1
źródło
Zawsze jest Bogobogosort (Bogoception!). Wykonuje Bogosort na coraz większych podzbiorach listy, a następnie rozpoczyna wszystko od nowa, jeśli lista nie zostanie posortowana.
źródło
1 Umieść przedmioty do sortowania na kartach katalogowych.
2 Wyrzuć je w powietrze w wietrzny dzień, milę od domu.2 Wrzuć je do ogniska i potwierdź, że są całkowicie zniszczone.
3 Sprawdź, czy podłoga w kuchni jest poprawna.
4 Powtórz, jeśli nie jest to właściwa kolejność.
Najlepszym scenariuszem jest O (∞)
Edytuj powyżej na podstawie wnikliwej obserwacji Kenny'egoTM.
źródło
Pytanie „co chciałbyś, żeby to było?” sortować
Nie tylko może zaimplementować dowolną wyobrażalną wartość O (x) krótszą od nieskończoności, ale również czas potrzebny jest na udowodnioną poprawność (jeśli możesz czekać tak długo).
źródło
Nie ma nic gorszego niż nieskończoność.
źródło
Sortowanie Bozo to powiązany algorytm, który sprawdza, czy lista jest posortowana, a jeśli nie, zamienia losowo dwa elementy. Ma te same najlepsze i najgorsze wyniki, ale intuicyjnie spodziewałbym się, że średni przypadek będzie dłuższy niż Bogosort. Trudno jest znaleźć (lub wyprodukować) jakiekolwiek dane na temat wydajności tego algorytmu.
źródło
Segmenty π
Załóżmy, że π zawiera wszystkie możliwe kombinacje liczb skończonych. Zobacz pytanie dotyczące math.stackexchange
źródło
W najgorszym przypadku wydajność O (∞) może według niektórych nawet nie uczynić go algorytmem .
Algorytm to tylko seria kroków i zawsze możesz zrobić gorzej, poprawiając go trochę, aby uzyskać pożądany wynik w większej liczbie kroków niż poprzednio. Można było celowo umieścić w algorytmie wiedzę o liczbie kroków i sprawić, że będzie się on kończył i dawał poprawny wynik dopiero po wykonaniu określonej
X
liczby kroków.X
Może to być równie dobrze rzędu O (n 2 ) lub O (n n! ), Albo cokolwiek algorytm chciałby zrobić. To skutecznie zwiększyłoby zarówno optymalne, jak i średnie granice przypadków.Ale najgorszego scenariusza nie da się przebić :)
źródło
Moim ulubionym powolnym algorytmem sortowania jest sortowanie z marionetkami:
Najgorszy przypadek to złożoność
O(n^(log(3) / log(1.5))) = O(n^2.7095...)
.Inny powolny algorytm sortowania to tak naprawdę powolny!
Ten trwa
O(n ^ (log n))
w najlepszym przypadku ... nawet wolniej niż marionetka.źródło
źródło
Ta strona jest interesującą lekturą na ten temat: http://home.tiac.net/~cri_d/cri/2001/badsort.html
Moim ulubionym jest sillysort Toma Duffa:
źródło
Podwójny bogosort
Bogosort dwa razy i porównaj wyniki (aby mieć pewność, że są posortowane), jeśli nie zrób to ponownie
źródło
Możesz spowolnić dowolny algorytm sortowania, uruchamiając losowo krok „czy to posortowane”. Coś jak:
źródło
Tak, SimpleSort, teoretycznie działa,
O(-1)
ale jest to równoważne temu,O(...9999)
co z kolei jest równoważne O (∞ - 1), co jak to się dzieje, jest również równoważne O (∞). Oto moja przykładowa realizacja:źródło
Jeden, nad którym właśnie pracowałem, polega na wybraniu dwóch losowych punktów, a jeśli są w złej kolejności, odwróceniu całego podzakresu między nimi. Algorytm znalazłem na http://richardhartersworld.com/cri_d/cri/2001/badsort.html , który mówi, że przeciętny przypadek jest prawdopodobnie gdzieś w okolicach O (n ^ 3) lub O (n ^ 2 log n) ( nie jest do końca pewien).
Myślę, że można by to zrobić bardziej efektywnie, ponieważ myślę, że byłoby możliwe wykonanie operacji odwrócenia w czasie O (1).
Właściwie właśnie zdałem sobie sprawę, że zrobienie tego spowodowałoby, że cała rzecz, o której mówię, może dlatego, że właśnie zdałem sobie sprawę, że struktura danych, którą miałem na myśli, pozwoliłaby uzyskać dostęp do elementów losowych w O (log n) i określić, czy wymaga odwrócenia w O (n ).
źródło
Randomsubsetsort.
Mając tablicę n elementów, wybierz każdy element z prawdopodobieństwem 1 / n, losuj te elementy i sprawdź, czy tablica jest posortowana. Powtarzaj, aż posortowane.
Oczekiwany czas pozostawia czytelnikowi jako ćwiczenie.
źródło