Applicazioni pratiche di Radix Sort


20

L'ordinamento Radix è teoricamente molto veloce quando sai che le chiavi si trovano in un certo intervallo limitato, ad esempio valori nell'intervallo . Se converti semplicemente i valori in base che richiede tempo , esegui un ordinamento base radix e poi converti nuovamente nella base originale per un algoritmo globale .[ 0 n k - 1 ] k < lg n n Θ ( n ) n Θ ( n k )n[0nk1]k<lgnnΘ(n)nΘ(nk)

Tuttavia, ho letto che in pratica l'ordinamento radix è in genere molto più lento rispetto a fare ad esempio un quicksort randomizzato :

Per array di grandi dimensioni, l'ordinamento radix ha il conteggio di istruzioni più basso, ma a causa delle prestazioni della cache relativamente scarse, le prestazioni complessive sono peggiori rispetto alle versioni ottimizzate per la memoria di mergesort e quicksort.

Radix sort è solo un bel algoritmo teorico o ha usi pratici comuni?

Risposte:


15

I tipi Radix sono spesso, in pratica, i tipi più veloci e utili su macchine parallele.

Su ciascun nodo del multiprocessore probabilmente fai qualcosa come un quicksort, ma l'ordinamento radix consente a più nodi di lavorare insieme con meno sincronizzazione rispetto ai vari tipi ricorsivi.

Ci sono anche altre situazioni. Se hai bisogno di un ordinamento stabile (un ordinamento in cui ogni volta che due chiavi sono uguali rimangono nello stesso ordine anziché essere riorganizzate), non sono a conoscenza di alcuna versione di quicksort che sarà utile. Anche Mergesort è stabile (se implementato correttamente). Il tuo link è la prima volta che ho mai sentito qualcuno dire che si poteva creare un mergesort per avere un comportamento cache migliore rispetto all'ordinamento radix.


Patterson e Hennessy sottolineano lo stesso articolo sopra citato di Lamarca nel loro libro Computer Organization and Design.
Robert S. Barnes,

La tua menzione di Patterson mi ha ricordato l'importante lavoro che Andrea Arpaci-Dusseau ha svolto sulla cernita dei cluster circa 15 anni fa. (Patterson era un coautore). Nel documento del 1997 hanno effettivamente deciso che l'ordinamento a radice parziale era preferibile per eseguire il quicksort anche sui singoli nodi. (Ho aggiunto i riferimenti alla risposta).
Wandering Logic,

Interessante. Nella quarta edizione del 2009 di CompOrg fanno riferimento al lavoro di Lamarca sulle versioni precedenti dell'ordinamento Radix essendo cache ostile (pag. 489), ma poi a pagina 490 sotto i grafici che confrontano Quicksort e l'ordinamento Radix dicono, "A causa di tali risultati, nuove versioni di Sono stati inventati gli ordinamenti Radix che tengono conto della gerarchia della memoria, per riguadagnare i suoi vantaggi algoritmici ". Sono curioso di sapere come funzionano queste nuove versioni di Radix Sort.
Robert S. Barnes,

Il mio sospetto è che Lamarca abbia appena usato uno stupido radix sort (uno che mantiene i suoi secchi come elenchi collegati). Nessuno lo farebbe mai. Dovresti implementare i bucket utilizzando una sorta di array dinamico ottimizzato (ad esempio, come un C ++ vector). Ma non lo so, dato che non ho letto i giornali di Lamarca.
Wandering Logic,

@WanderingLogic dove utilizza l'ordinamento radix i bucket? Intendi il secchio qui?
Bar

3

@Robert: il tuo link è abbastanza sorprendente (in realtà non sono riuscito a trovare la frase citata). La mia esperienza personale è per input casuali, l'ordinamento radix è molto più veloce dell'STL std::sort(), che utilizza una variante di quicksort. std::sort()Prima usavo un algoritmo del 50% più veloce sostituendolo con un ordinamento radix instabile. Non sono sicuro di quale sia la "versione ottimizzata per la memoria" di quicksort, ma dubito che possa essere due volte più veloce della versione STL.

Questo post sul blog ha valutato l'ordinamento radix insieme a diversi altri algoritmi di ordinamento. In breve, in questa valutazione, sono std::sort()necessari 5,1 secondi per ordinare 50 milioni di numeri interi, mentre l'ordinamento radix sul posto / instabile richiede 2,0 secondi. L'ordinamento radix stabile dovrebbe essere ancora più veloce.

L'ordinamento Radix è anche ampiamente utilizzato per l'ordinamento stabile di stringhe. Varianti di radix sort sono talvolta visibili per la costruzione di array di suffissi, BWT, ecc.


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.