Aggiornamento: Ho ampliato questa risposta in un documento ordinamento con una media di confrontil g (n!)+o(n) .
Sì, esiste un tale algoritmo. Dimostrerò solo legato, ma in base a una presunta ipotesi di randomizzazione otteniamo anche l g ( n ! ) + O ( n 1 - ε ) . Descriverò anche un tentativo per n 0,5 + o ( 1 ) e O ( n 0,5 - ε ) .l g (n!)+o(n)l g (n!)+O( n1 - ε)n0,5 + o ( 1 )O ( n0,5 - ε)
Possiamo presumere che tutti gli elementi siano distinti, annotandoli se necessario; il caso medio utilizza elementi distinti in ordine casuale. Possiamo calcolare il numero medio di confronti aggiungendo la perdita di entropia per ciascun confronto rispetto all'uso di una moneta equa.
Il punto di partenza è insertion sort con una ricerca binaria per decidere dove inserire l'elemento successivo nella ordinata sottoinsieme . Quando ( 1 - ε ) 2 m ≤ | S | ≤ 2 m - 1 , un inserimento utilizza al massimo m confronti, che (in termini di entropia) è ottimale fino a un fattore additivo O ( ε ) (e per la complessità del caso medio, 2 m ≤ | S | ≤ ( 1 + ε ) 2 mS(1−ε)2m≤|S|≤2m−1mO(ε)2m≤|S|≤(1+ε)2mfunziona anche). Ora, quando non è vicino a una potenza di 2, l'inserimento di un elemento A non è ottimale (anche nel caso medio e indipendentemente da come bilanciamo ogni query), ma se si sprecano o ( 1 ) confronti, si potrebbe indirizzare A a una distribuzione approssimativamente uniforme su un intervallo di S di lunghezza vicino a una potenza di 2, otteniamo l'ottimalità desiderata.|S|Ao(1)AS
Raggiungiamo questo obiettivo aggiungendo elementi in lotti e talvolta confrontando in modo efficiente elementi del lotto tra loro, in modo tale che l'intervallo di corrispondente a un elemento A diminuisca in modo quasi casuale (e con la distribuzione di probabilità di A all'interno dell'intervallo quasi uniforme), e quando la lunghezza dell'intervallo è abbastanza vicino a una potenza di 2, facendo la ricerca binaria per inserire a .SAAA
Costrutti comuni
Manterremo un sottoinsieme di elementi ordinati, e per ciascun elemento indifferenziati A , terremo traccia del minimo dell'intervallo I A di S dove A è noto per essere collocata. | I A | è la lunghezza di I A ; I A = I B è in base all'identità degli intervalli.SAIASA|IA|IAIA=IB
Sia essere: confronta A con B , quindi (in ordine casuale) confronta A e B con gli elementi corrispondenti di S fino a quando i loro intervalli sono disgiunti (o hanno lunghezza 1). L'elemento di S è scelto (in modo coerente) per rendere le probabilità per il confronto più vicino a 1/2 come possibile, presumendo che quando C o m p a r e viene chiamato, ( A , B )Compare(A,B)ABABSSCompare(A,B)è distribuita uniformemente su . A causa della disgiunzione alla fine, C o m p a r e preserva l'assunzione uniformità.IA×IBCompare
Le seguenti sezioni possono essere lette indipendentemente l'una dall'altra.
A algoritmolg(n!)+o(n)
Dato: un elenco ordinato e un batch di m elementi non ordinati; m ∈ ω ( 1 ) ∩ o ( | S | ) ; gli elementi indifferenziati sono relative casuale S .Smm∈ω(1)∩o(|S|)S
Ripeti (1) - (3) quando possibile:
1. Scegli due elementi e B dal lotto con I A = I B (qualsiasi scelta funzionerà).
2. Eseguire C o m p a r e ( A , B ) .
3. Se | I A | è abbastanza vicino a una potenza di 2, (nota 1) rimuovere A dal lotto (senza dimenticare I A ); e fare in modo simile con B . Infine: inserisci tutti gli elementi inABIA=IB
Compare(A,B)
|IA|AIAB
e completa l'ordinamento.S
Nota 1: per "abbastanza vicino", qualsiasi errore relativo (in funzione di m ) funziona fintanto che gli elementi m - o ( m ) saranno rimossi nel passaggio (4) (possibile con la nota 2). In base a un'ipotesi di randomizzazione congetturata, l'uso di c log log m / log m errore relativo acquisisce m ( 1 - log - Θ ( c ) m ) elementi, consentendo a l g ( n ! )o(1)mm−o(m)cloglogm/logmm(1−log−Θ(c)m) algoritmo di ordinamento comparativo medio.lg(n!)+O(nloglogn/logn)
Nota 2: poiché la stessa sequenza di confronti porta allo stesso intervallo di delimitazione, quasi tutti gli elementi passeranno attraverso i passaggi (1) volte (a meno che non vengano rimossi nel passaggio 4). All'inizio, se A < B e scegliamo A , confrontiamo A con l'elemento S [ ≈ ( 1 - 1 / √Ω(logm)A<BAAe ogni applicazione del passaggio da (3) adAhaprobabilitàO(1)di ridurre| IA| in≈1/(1-1/ √S[≈(1−1/2–√)|S|]AO(1)|IA|volte. Ora per ogni rapportoa>1che non è un potere razionale di 2, abbiamo∀ε>0∀d>0∃m,n∈N≈1/(1−1/2–√)a>1, e quindi otteniamo illimiteo(n).∀ε>0∀d>0∃m,n∈N1−ε<amd2n<1+εo(n)
Un probabile algoritmo lg(n!)+O(n1−ε)
Modulo un'ipotesi di randomizzazione, possiamo ottenere i confronti medi come segue.lg(n!)+O(n1−ε)
Mescola casualmente gli oggetti e ordina la prima metà in un elenco , mantenendo la seconda metà come batch non ordinato.S
A∈batchG={B∈batch:|P(A<B)−0.5|<n−0.51ε}GAS
- B∈GΘ(1)Compare(A,B)|IA|n−εCompare(A,B)|IA|n−εAS
- B∈GCompare(A,B)B∈G
AnΘ(1)nΘ(1)Θ(logn)εlg(n!)+O(n1−ε)AB
Compare(A,B)ε≈(1−ε)/4/log4/32≈0.09
Un approccio forse molto migliore è attendere fino a quando un intervallo è vicino a una potenza di 2, controllando non le singole lunghezze dell'intervallo ma le distribuzioni delle lunghezze.
lg(n!)+n0.5+o(1)
|S|=nnIA|IA|n1−o(1)|IA|2⌊lg|IA|⌋A<S[i]n0.5+o(1)
|IA|2⌊lg|IA|⌋
S
|IA|2⌊lg|IA|⌋|IA|/2⌊lg|IA|⌋|IA|2⌊lg|IA|⌋
Compare(A,B)P(A<B)≈0.5IAIAComparek=ω(1)k=ω(1)kSO(logkn+logk)kΘ(logk)k
1/2+n−0.5O(1/n)no(1)n0.5+o(1)
lg(n!)+O(n0.5−ε)|S|+n0.5+ε≈n0.5+ε≈n0.5+εn0.5−ε/2+o(1)SnεIAΘ(nε/2)n1−o(1)nε/2−o(1)lg(n!)+O(n1−ε)O(n0.5−ε′)ε
lg(n!)+o(n)1.5n+o(n)(2+ε)n−O(1)