Perché Radix Sort ?


23

Nell'ordinamento radix ordiniamo prima per cifra meno significativa, quindi ordiniamo per seconda cifra meno significativa e così via e finiamo con un elenco ordinato.

Ora, se abbiamo un elenco di numeri, abbiamo bisogno di bit per distinguere tra quei numeri. Quindi il numero di passaggi di ordinamento radix che facciamo sarà . Ogni passaggio richiede tempo e quindi il tempo di esecuzione dell'ordinamento radix èlog n log n O ( n ) O ( n log n )nlognlognO(n)O(nlogn)

Ma è noto che si tratta di un algoritmo di tempo lineare. Perché?


Questo è il motivo per cui gli ordinamenti temporali lineari di solito richiedono che l'input sia intero su un intervallo fisso. L'ordinamento Radix richiede un intervallo fisso sulle cifre. Nel tuo esempio hai supposto che l'intervallo fosse , ma è possibile qualsiasi intervallo intero per le cifre; per esempio, avresti potuto scegliere[ 0 , [0,1][0,n]
Joe l'

Risposte:


19

se abbiamo un elenco di numeri abbiamo bisogno di bitregistro nnlogn

No: se abbiamo un elenco di numeri tra e , abbiamo bisogno di bit. Non esiste alcuna relazione tra e in generale.2 k - 1 k k log n02k1kklogn

Se i numeri sono tutti distinti, allora e l'ordinamento radix su numeri distinti ha quindi una complessità temporale di . In generale, la complessità dell'ordinamento radix è dove è il numero di elementi da ordinare e è il numero di bit in ciascun elemento.Ω ( n log n ) Θ ( nlognkΩ(nlogn)n kΘ(nk)nk

Dire che la complessità dell'ordinamento radix è significa prendere una dimensione di bit fissa per i numeri. Ciò implica che per abbastanza grandi , ci saranno molti valori duplicati.nO(n)n


Esiste un teorema generale secondo cui un metodo di ordinamento di array o elenchi che funziona confrontando due elementi alla volta non può essere eseguito più rapidamente di nel caso peggiore. L'ordinamento Radix non funziona confrontando gli elementi, ma lo stesso metodo di prova funziona. L'ordinamento Radix è un processo decisionale per determinare quale permutazione applicare all'array; ci sonopermutazioni dell'array e l'ordinamento radix prende decisioni binarie, cioè decide se scambiare due elementi o meno in ogni fase. Dopo decisioni binarie, l'ordinamento radix può decidere tra permutazioni. Per raggiungere lapossibili permutazioni, è necessario che .n ! m 2 m n ! m log ( n ! ) = Θ ( n log n )Θ(nlogn)n!m2mn!mlog(n!)=Θ(nlogn)

Un presupposto nella dimostrazione che non ho scritto sopra è che l'algoritmo deve funzionare nel caso in cui gli elementi siano distinti. Se è noto a priori che gli elementi non sono tutti distinti, allora il numero di permutazioni potenziali è inferiore al totale. Quando si ordinano i numeri -bit, è possibile avere elementi distinti solo quando ; in tal caso, la complessità dell'ordinamento radix è effettivamente . Per valori maggiori di , ci devono essere delle collisioni, il che spiega come l'ordinamento radix può avere una complessità inferiore a quando .k n n 2 k Ω ( n registro n ) n Θ ( n registro n ) n > 2 kn!knn2kΩ(nlogn)nΘ(nlogn)n>2k


1
Un punto di vista alternativo è quello del modello di costo word-RAM: la nostra macchina può lavorare con numeri interi di bit in tempo costante. (Le macchine attuali hanno ) In questo modo, un passo di ordinamento della distribuzione con bucket da può essere eseguito in tempo accedendo direttamente a un elemento di array corrispondente. In questo modo, l'ordinamento radix è lineare per numeri interi di bit ciascuno. ww=642wO(1)nw=O(logn)
Sebastian

9

Fai attenzione con la tua analisi: cosa pensi di fare eseguire l'ordinamento in time? Questo perché ciascuna delle tue cifre è compresa tra e , il che significa che le tue cifre possono assumere possibili valori. È necessario un algoritmo di ordinamento stabile, ad esempio è possibile scegliere il conteggio dell'ordinamento. Il conteggio dell'ordinamento viene eseguito in . Se , il conteggio dell'ordinamento viene eseguito in un tempo lineare.O(n)0k1kΘ(n+k)k=O(n)

Ognuna delle tue stringhe o numeri ha cifre. Come dici tu, fai passa sopra di loro. Quindi, l'ordinamento radix funziona chiaramente nel tempo di . Ma se consideriamo costante e , vediamo che l'ordinamento radix viene eseguito in tempo lineare.ddΘ(d(n+k))dk=O(n)


1
Ad esempio, supponiamo che stai ordinando numeri interi nell'intervallo per alcuni per costante . Quindi puoi avere cifre ognuna con intervallo . N = O ( n d ) d O ( d ) O ( n )[0,N1]N=O(nd)dO(d)O(n)
Joe,

-2

Penso che il presupposto sia sbagliato. È possibile eseguire l'ordinamento radix con numeri, ad es. Esadecimali. Pertanto, ad ogni passaggio si divide la matrice di numeri in secchi.16k=log2(n)16


6
Per quanto riguarda big-O, non c'è alcuna differenza tra e . log 16 nlog2nlog16n
Rick Decker,
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.