Czy istnieje algorytm sortowania oparty na porównaniu, który wykorzystuje średnie porównania ?
Istnienie algorytmu porównania najgorszego przypadku jest otwartym problemem, ale średni przypadek wystarcza dla algorytmu losowego z oczekiwanym porównania dla każdego wkładu. Znaczenie polega na tym, że są to porównania o (n) z optymalnych, marnując średnio tylko o (1) porównań na element.
Ponieważ mam już taki algorytm, włączam go jako odpowiedź (używając formatu Q / A ), ale z zadowoleniem przyjmuję dodatkowe odpowiedzi, w tym inne algorytmy, czy taki algorytm był już znany, poprawiając , a najgorsze- case .
Wcześniejsza praca:
sortowanie według scalania używa porównań (nawet w najgorszym przypadku).
Sortowanie z wstawianiem korespondencji (znane również jako sortowanie Forda i Johnsona) również używa porównań, ale ze znacznie mniejszą stałą w .
Poprawiona średnia złożoność sortowania opartego na porównaniu (autorstwa Kazuo Iwamy i Junichi Teruyama) - ich algorytm wstawiania (1,2) przypomina część mojej odpowiedzi poniżej.
źródło
Odpowiedzi:
Aktualizacja: Rozszerzyłem tę odpowiedź na artykuł Sortowanie ze średnią porównańlg(n!)+o(n) .
Tak, taki algorytm istnieje. Udowodnię tylko, że , ale przy założeniu prawdopodobnej randomizacji otrzymujemy również . Opiszę także próbę dla i .l g ( n ! ) + O ( n 1 - ε ) n 0,5 + o ( 1 ) O ( n 0,5 - ε )lg(n!)+o(n) lg(n!)+O(n1−ε) n0.5+o(1) O(n0.5−ε)
Możemy założyć, że wszystkie elementy są różne, w razie potrzeby dodając do nich adnotacje; przeciętny przypadek wykorzystuje różne elementy w losowej kolejności. Możemy obliczyć średnią liczbę porównań, dodając utratę entropii dla każdego porównania w stosunku do użycia uczciwej monety.
Punktem wyjścia jest wstawianie sortowania z zasadą poszukiwania binarnego zdecydować, gdzie umieścić następny element do posortowanej podzbiór . Gdy , insercja wykorzystuje co najwyżej porównań, które (pod względem entropii) są optymalne do współczynnika addytywnego (a dla złożoności średnich przypadków również działa). Teraz, kiedynie jest bliskie potędze 2, wstawienie elementu jest nieoptymalne (nawet w średnim przypadku i niezależnie od tego, jak równoważymy każde zapytanie), ale jeśli marnujemy porównania , możemy skierować do mniej więcej równomiernego rozkładu w odstępie czasu( 1 - ε ) 2 m ≤ | S | ≤ 2 m - 1 m O ( ε ) 2 m ≤ | S | ≤ ( 1 + ε ) 2 m | S | A o ( 1 ) A SS (1−ε)2m≤|S|≤2m−1 m O(ε) 2m≤|S|≤(1+ε)2m |S| A o(1) A S o długości zbliżonej do potęgi 2, uzyskujemy pożądaną optymalność.
Osiągamy to poprzez dodawanie elementów w partiach, a czasem efektywne porównywanie ze sobą elementów partii, tak że przedział odpowiadający pierwiastkowi zmniejsza się quasi-losowo (i wraz z rozkładem prawdopodobieństwa wewnątrz przedziału prawie jednolity), a gdy długość odstępu jest wystarczająco blisko do potęgi 2, wykonując przeszukiwanie binarne wstawianie .A A AS A A A
Typowe konstrukcje
Będziemy trzymać podzbiór elementów segregowanych i niesegregowanych dla każdego elementu , będziemy śledzić minimalnego odstępu z gdzie jest znany być zlokalizowany. jest długością ; wynika z tożsamości przedziałów.A I A S A | I A | I A I A = I BS A IA S A |IA| IA IA=IB
Niech będzie: Porównaj z , a następnie (w losowej kolejności) porównaj i z odpowiednimi elementami dopóki ich odstępy nie będą rozłączne (lub będą miały długość 1). Element jest wybierany (w spójny sposób), aby prawdopodobieństwo porównania było jak najbliższe 1/2, przy założeniu, że gdy wywoływane jest , rozkłada się równomiernie na . Ze względu na rozłączność na końcu zachowuje założenie jednolitości.Compare(A,B) A B A B S S Compare (A,B) jaZA× Ib C o m p a r e
Poniższe sekcje można odczytywać niezależnie od siebie.
algorytml g ( n ! ) + o ( n )
Biorąc pod uwagę: posortowaną listę i partię nieposortowanych elementów; ; nieposortowanej elementy są losowo w stosunku do .S. m m ∈ ω ( 1 ) ∩ o ( | S| ) S.
Powtórz (1) - (3), gdy jest to możliwe:ZA b jaZA= Jab
C o m p a r e (A,B)
| jaZA| I A B SZA jaZA b
S.
1. Wybierz dwa elementy i z partii z (dowolny wybór będzie działał). 2. Uruchom . 3. Jeżelijest wystarczająco blisko mocy 2 (uwaga 1) usuń z partii (nie zapominając o ); i zrobić podobnie z . Wreszcie: wstaw wszystkie elementy do i zakończ sortowanie.B I A = I B C o m p a r e ( A , B ) | I A |
Uwaga 1: W przypadku „wystarczająco blisko” każdy błąd względny (jako funkcja ) działa, dopóki elementy zostaną usunięte w kroku (4) (możliwe dzięki uwadze 2). Zgodnie z domniemanym założeniem randomizacji, użycie błędu względnego przechwytuje elementy , pozwalając na średni algorytm sortowania porównania.m m - o ( m ) c log log m / log m m ( 1 - log - Θ ( c ) m ) l g ( n ! ) + O ( n log log n / log n )o ( 1 ) m m - o ( m ) c loglogm / logm m(1−log−Θ(c)m) lg(n!)+O(nloglogn/logn)
Uwaga 2: Ponieważ ta sama sekwencja porównań prowadzi do tego samego interwału granicznego, prawie wszystkie elementy przejdą krok (1) razy (chyba że zostaną usunięte w kroku 4). Na początku, jeśli i wybieramy , porównujemy z elementem , a każde zastosowanie kroku (3) do ma prawdopodobieństwo zmniejszeniarazy . Teraz dla każdego stosunku który nie jest racjonalną potęgą 2, mamy , więc otrzymujemyA < B A A S [ ≈ ( 1 - 1 / √Ω(logm) A<B A A AO(1)| IA| ≈1/(1-1/ √S[≈(1−1/2–√)|S|] A O(1) |IA| a>1∀ε>0∀d>0∃m,n∈N≈1/(1−1/2–√) a>1 o(n)∀ε>0∀d>0∃m,n∈N1−ε<amd2n<1+ε o(n) uwiązany.
Prawdopodobny algorytmlg(n!)+O(n1−ε)
Modulo założenie randomizacji, możemy osiągnąć średnie porównania w następujący sposób.lg(n!)+O(n1−ε)
Losowo potasuj elementy i posortuj pierwszą połowę na listę , zachowując drugą połowę jako nieposortowaną partię.S
Powtarzaj, aż partia będzie pusta:A∈batch G={B∈batch:|P(A<B)−0.5|<n−0.51ε} G A S
losowo wybierz . Niech . Jeśli jest pusty, usunąć ze wsadu i wkładki do . Inaczej:G = { B ∈ partii : | P ( A < B ) - 0,5 | < n - 0,51 ε } G A S
Jeśli nasze założenie randomizacji się sprawdzi (tzn. Rozkład długości przedziałów i pozycji jest wystarczająco losowy), to przez większą część procesu typowe można skutecznie porównać z wyborem elementów (z różne długości przedziałów). Dlatego zazwyczaj możemy wybrać porównanie dla (1) powyżej, a jeśli nie będziemy mieli szczęścia z wynikiem porównania, nadal mamy szanse , osiągając (jeśli jest wystarczająco małe, powiedzmy 0,01) a Algorytm porównania . Z pewnymi zmianami i przybliżeniami obliczenie całkowite może być quasilinearne: biorąc pod uwagę elementn Θ ( 1 ) n Θ ( 1 ) Θ ( log n ) ε l g ( n ! ) + O ( n 1 - ε ) A BA nΘ(1) nΘ(1) Θ(logn) ε lg(n!)+O(n1−ε) A , Obliczyć długość interwału obiecujące, a potem patrzeć sz prawej przybliżonej centrum i interwałowych długościach.B
Istnieje wiele sposobów na zoptymalizowanie porównań, ale przeszkodą jest to, że każde porównanie może być pechowe i mamy ograniczoną liczbę porównań. Jeśli po optymalizacji wykonuje średnio 4 porównania i „udaje się” z prawdopodobieństwem 1/4, otrzymujemy .ε ≈ ( 1 - ε ) / 4 / log 4 / 3 2 ≈ 0,09Compare(A,B) ε≈(1−ε)/4/log4/32≈0.09
Być może znacznie lepszym podejściem jest czekanie, aż przedział zbliża się do potęgi 2, kontrolując nie poszczególne długości przedziałów, ale rozkłady długości.
Próba algorytmulg(n!)+n0.5+o(1)
Załóżmy, że i otrzymujemy nieposortowaną partię elementów z przedziałami , zzwykle i rozmieszczone równomiernie (do błędu losowego i utrzymujące z wystarczającą precyzją, nawet jeśli uwarunkowane ). Następnie możemy posortować elementy marnujące średnio porównania w następujący sposób: (*) Wstaw wszystkie elementy w kolejności ich początkowego . W ten sposób wszystkie elementy są wstawiane, gdy ich długość przedziału jest zbliżona do potęgi 2.n I A | I A | n 1 - o ( 1 ) | I A ||S|=n n IA |IA| n1−o(1) A<S[i]n0,5+o(1)| IA||IA|2⌊lg|IA|⌋ A<S[i] n0.5+o(1)
|IA|2⌊lg|IA|⌋
Algorytm sortowania będą: Losowo przetasować listę i sortować pierwszej połowie . Aby wstawić drugą połowę, ustaw właściwy rozkład i wykonaj powyższe (*).S
Aby zrobić prawidłowa dystrybucja, możemy zrobić rozkład „losowy”, a następnie wstrzymać właściwą część elementów dla każdego podczas losowania reszty (w razie potrzeby powtarzanie). Jednak chociaż powinno to poprawić globalnie, nie wiemy, czy można nim sterować lokalnie z wymaganą precyzją (stąd słowo „próba” powyżej). | IA| /2⌊lg| IA| ⌋| IA||IA|2⌊ l g |IA| ⌋ | jaZA|/2⌊lg|IA|⌋ |IA|2⌊lg|IA|⌋
Aby utworzyć rozkład „losowy”, możemy losowo użyć z , z tym wyjątkiem, że przy początkowym wszystkie identyczne, nie oczekujemy randomizacji na sublogarytmicznej głębokości (tzn. z wystarczająco długo). Przypuszczam jednak, że otrzymujemy randomizację na głębokości sublogarytmicznej przy użyciu uogólnień (prawdopodobnie każdy rozsądny wybór zadziała) elementów do elementów : Jeśli utrzymamy splątane elementy (tj. połączone za pomocą wyników porównania), powinniśmy mieć o noncommuting wyborów dla każdego porównania z . To powinno pozwolićP ( A < B ) ≈ 0,5 I A I A C o m p a r e k = ω ( 1 ) k = ω ( 1 ) k S O ( log k n + log k ) k Θ ( log k )Compare(A,B) P(A<B)≈0.5 IA IA Compare k=ω(1) k=ω(1) k S O(logkn+logk) głębokość randomizacji, zgodnie z potrzebami (przy założeniu, że nie jest zbyt duża, ponieważ potrzebujemy głębokości aby rozdzielić elementy). Oczekuję, że obliczenie może być quasilinear, jeśli używa się wystarczająco małego .k Θ(logk) k
Ponieważ porównanie z prawdopodobieństwem tak tylko marnuje entropię , początkowa randomizacja i niewielka niejednorodność elementów w ich przedziałach granicznych powinna wymagać tylko odpady entropijne. Jeśli kształtowanie rozkładu powiedzie się wystarczająco dobrze, odpady entropijne wynikają przede wszystkim z niedopasowania długości przedziałów podczas (*) (stąd ). O ( 1 / n ) n O ( 1 ) N 0,5 + O ( 1 )1/2+n−0.5 O(1/n) no(1) n0.5+o(1)
Możliwa kombinacja :lg(n!)+O(n0.5−ε) Jeśli kształtowanie rozkładu działa wystarczająco dobrze, a wielkość partii jest równa i selektywnie odrzucaj w (*) (powyżej), możemy wstawić wszystkie elementy oprócz tych z odpadami entropii w następujący sposób. Podziel na prawie równych przedziałach, a gdy podczas wstawiania osiądzie na przedziale, odrzuć (tj. Anuluj wstawienie), jeśli przedział jest zbyt długi, zmniejszając w ten sposób zmienność długości tych przedziałów ≈ n 0,5 + ε ≈ n 0,5 + ε n 0,5 - ε / 2 + o ( 1 ) S n ε I A Θ ( n ε / 2 ) n 1 - o (|S|+n0.5+ε ≈n0.5+ε ≈n0.5+ε n0.5−ε/2+o(1) S nε IA Θ(nε/2) razy, co z kolei zmniejsza w zależności od potrzeb zmiany długości przedziałów losowych razy . Teraz możemy użyć powyższego algorytmu , aby wstawić pozostałe elementy marnotrawstwem jeśli jest małe wystarczająco. n ε / 2 - o ( 1 ) l g (n!)+O( n 1 - ε )O( n 0,5 - ε ′ ) εn1−o(1) nε/2−o(1) lg(n!)+O(n1−ε) O(n0.5−ε′) ε
Złożoność sortowania w najgorszym przypadku: Najprawdopodobniej istnieje algorytm sortowania z porównaniami najgorszych przypadków. Aby znaleźć medianę, istnieje liniowa przerwa między średnim przypadkiem (porównania ) a najgorszym przypadkiem (porównania co najmniej ). Jednak w przypadku sortowania istnieje duża swoboda w organizowaniu porównań i znajdowaniu nowych algorytmów sortowania.1,5 n + o ( n ) ( 2 + ε ) n - O ( 1 )lg(n!)+o(n) 1.5n+o(n) (2+ε)n−O(1)
źródło