Perché Randomized Quicksort ha un costo di runtime nel caso peggiore O (n log n)


18

L'ordinamento rapido randomizzato è un'estensione dell'ordinamento rapido in cui l'elemento pivot viene scelto in modo casuale. Quale può essere la peggiore complessità temporale di questo algoritmo. Secondo me, dovrebbe essere O(n2) , poiché il caso peggiore si verifica quando il perno scelto casualmente viene selezionato in ordine ordinato o inverso . Ma in alcuni testi [1] [2] la sua complessità temporale peggiore è scritta come O(nlogn)

Che cosa è corretto?


3
Dovresti avere questo "testo" di cui stai parlando. C'è qualcosa nascosto lì. Lo troverai se
rileggi

Nota: Link [1] è morto. Link [2] afferma chiaramente che l'algoritmo è randomizzato, quindi per ogni input non hai "un runtime", ma "un runtime previsto". E il runtime previsto per il peggior input possibile è O (n log n).
gnasher729,

Risposte:


18

Entrambe le fonti si riferiscono al "tempo di esecuzione previsto nel peggiore dei casi" di Immagino che questo si riferisca al tempo previsto, che differisce dal caso peggiore in assoluto.O(nlogn).

Quicksort di solito ha un requisito assoluto di tempo peggiore di . Il caso peggiore si verifica quando, ad ogni passo, la procedura di partizione suddivide una matrice n- lunghezza in matrici di dimensioni 1 e n - 1 . Questa selezione "sfortunata" di elementi pivot richiede chiamate O ( n ) ricorsive, portando a un caso peggiore O ( n 2 ) .O(n2)n1n-1O(n)O(n2)

La scelta del pivot in modo casuale o casuale mescolando l'array prima dell'ordinamento ha l'effetto di rendere molto improbabile il caso peggiore, in particolare per array di grandi dimensioni. Vedi Wikipedia per una prova che il previsto requisito di tempo è . Secondo un'altra fonte , "la probabilità che quicksort utilizzi un numero quadratico di confronti durante l'ordinamento di un array di grandi dimensioni sul computer è molto inferiore alla probabilità che il computer venga colpito da un fulmine".O(nlogn)

Modificare:

Per il commento di Bangye, è possibile eliminare la sequenza di selezione pivot nel caso peggiore selezionando sempre l'elemento mediano come pivot. Dal momento che trovare la mediana prende tempo, questo dà Θ ( n log n ) nel caso peggiore le prestazioni. Tuttavia, poiché è molto improbabile che quicksort randomizzato inciampi nel caso peggiore, la variante deterministica di quicksort di ricerca mediana viene usata raramente.O(n)Θ(nlogn)


Quindi, in generale, possiamo dire che si comporta come quadratico nel peggiore dei casi
Atinesh

@Atinesh No, almeno se intendi con quello. Θ
Raffaello

Penso che sia corretto affermare che la prestazione nel caso peggiore di quicksort randomizzato sia O(n2).
James Evans,

4
Quicksort può richiedere solo tempo nel caso peggiore se si impiega un algoritmo a tempo lineare per trovare la mediana come perno. Naturalmente, Quicksort randomizzato ha di solito prestazioni migliori. Θ(nlogn)
Bangye,

6

Mancava che questi testi parlassero di " tempo di esecuzione previsto nel caso peggiore ", non di "runtime nel caso peggiore".

Stanno discutendo un'implementazione di Quicksort che coinvolge un elemento casuale. Normalmente hai un algoritmo deterministico, cioè un algoritmo che per un dato input produrrà sempre gli stessi identici passaggi. Per determinare il "peggior runtime", si esaminano tutti gli input possibili e si sceglie quello che produce il peggior runtime.

Ma qui abbiamo un fattore casuale. Dato un certo input, l'algoritmo non farà sempre le stesse fasi perché è coinvolta una certa casualità. Invece di avere un runtime per ogni input fisso, abbiamo un "runtime atteso": controlliamo ogni possibile valore delle decisioni casuali e la loro probabilità, e il "runtime atteso" è la media ponderata del runtime per ogni combinazione di decisioni casuali , ma comunque per un input fisso.

Quindi calcoliamo il "runtime previsto" per ogni possibile input e per ottenere il "runtime previsto nel caso peggiore", troviamo l'unico input in cui il runtime previsto è il peggiore. E apparentemente hanno dimostrato che il caso peggiore per il "runtime previsto" è solo O (n log n). Non sarei sorpreso se solo scegliere il primo pivot a caso cambierebbe il runtime previsto nel peggiore dei casi in o (n ^ 2) (piccolo o invece di Big O), perché solo pochi su n pivot porteranno al caso peggiore comportamento.


2

Si noti che ci sono due cose da considerare aspettative / media: la permutazione di input e i perni (uno per partizionamento).

nΘ(nlogn)

Θ(nlogn)

In conclusione, controlla le fonti per quale implementazione usano e quale quantità considerano casuale. risolto nella loro analisi.


Considera questa domanda postimg.org/image/fiurc4z87 che ho posto in esame. Quale appropriata
risposta

1
@Atinesh Penso che la mia risposta ti fornisca abbastanza informazioni su questo.
Raffaello

-1

O(n2)

Il caso peggiore per quicksort randomizzato sono gli stessi elementi dell'input. Es: 2,2,2,2,2,2

T(n)=T(n-1)+nO(n2)


Questo se hai un'implementazione estremamente stupida di quicksort. Qualsiasi implementazione discreta sarà nel primo scambio partizione # 1 e # 6, # 2 e # 5, # 3 e # 4, e sarà quindi ordinare due sottoarray di lunghezza 3.
gnasher729

Immagino che tu abbia <= e> = su entrambi i puntatori che scansionano da LHS e RHS. Ecco perché lo stai dicendo. '=' è associato a uno dei due puntatori, non a entrambi. In tal caso l'albero di ricorsione cresce fino a n.
Pratica

Ed è quello che chiamo un'implementazione estremamente stupida. Qualsiasi implementazione che richiede un tempo di esecuzione quadratico per il caso "tutti gli elementi sono uguali" è criminalmente stupida. In realtà ci sono implementazioni che richiedono tempo lineare in questo caso (O (n), non O (n log n)).
gnasher729,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.