Applications pratiques de Radix Sort

20

Le tri Radix est théoriquement très rapide lorsque vous savez que les clés sont dans une certaine plage limitée, disons valeurs dans la plage [ 0 n k - 1 ] par exemple. Si k < lg n, vous venez de convertir les valeurs en base n, ce qui prend du temps Θ ( n ) , effectuez un tri radix en base n , puis convertissez-le à votre base d'origine pour un algorithme global Θ ( n k ) .n[0nk1]k<lgnnΘ(n)nΘ(nk)

Cependant, j'ai lu que dans la pratique, le tri radix est généralement beaucoup plus lent que par exemple un tri rapide aléatoire :

Pour les baies de grande taille, le tri radix a le nombre d'instructions le plus faible, mais en raison de ses performances de cache relativement médiocres, ses performances globales sont inférieures à celles des versions optimisées en mémoire de mergesort et quicksort.

Le tri radix est-il juste un bon algorithme théorique, ou a-t-il des utilisations pratiques communes?

Robert S. Barnes
la source

Réponses:

15

Les tris Radix sont souvent, dans la pratique, les tris les plus rapides et les plus utiles sur les machines parallèles.

Sur chaque nœud du multiprocesseur, vous faites probablement quelque chose comme un tri rapide, mais le tri radix permet à plusieurs nœuds de fonctionner ensemble avec moins de synchronisation que les différents types récursifs.

Il y a aussi d'autres situations. Si vous avez besoin d'un tri stable (un tri où chaque fois que deux clés sont égales, elles restent dans le même ordre plutôt que d'être réarrangées), je ne connais aucune version de quicksort qui sera utile. Mergesort est également stable (s'il est correctement implémenté). Votre lien est la première fois que j'entends quelqu'un dire que le mergesort pourrait avoir un meilleur comportement de cache que le tri radix.

Logique errante
la source
Patterson et Hennessy font la même remarque que l'article lié ci-dessus de Lamarca dans leur livre, Computer Organisation and Design.
Robert
Votre mention de Patterson m'a rappelé le travail important qu'Andrea Arpaci-Dusseau a fait sur le tri des grappes il y a environ 15 ans. (Patterson était co-auteur). Dans l'article de 1997, ils ont en fait décidé que le tri partiel par radix était préférable au tri rapide sur les nœuds individuels également. (J'ai ajouté les références à la réponse).
Wandering Logic
C'est intéressant. Dans la quatrième édition de 2009 de CompOrg, ils font référence au travail de Lamarca sur les versions précédentes du tri Radix étant non compatible avec le cache (p. 489), mais à la page 490 sous les graphiques comparant le tri Quicksort et Radix, ils disent: «En raison de ces résultats, de nouvelles versions de Le tri Radix a été inventé qui prend en compte la hiérarchie mémoire, pour retrouver ses avantages algorithmiques. " Je suis curieux de savoir comment ces nouvelles versions de Radix Sort fonctionnent.
Robert S.Barnes
Je soupçonne que Lamarca vient d'utiliser un type stupide de radix (celui qui conserve ses seaux sous forme de listes liées). Personne ne ferait jamais ça. Vous implémenteriez les compartiments en utilisant une sorte de tableau dynamique optimisé (par exemple, comme un C ++ vector). Mais je ne sais pas, car je n'ai pas lu les papiers de Lamarca.
Wandering Logic
@WanderingLogic où le tri Radix utilise-t-il des compartiments? Voulez-vous dire ici le tri par seau?
Bar
3

@Robert: Votre lien est assez surprenant (en fait, je n'ai pas pu trouver la phrase citée). Mon expérience personnelle est pour la saisie aléatoire, le tri radix est beaucoup plus rapide que le STL std::sort(), qui utilise une variante de quicksort. J'avais l'habitude de rendre un algorithme 50% plus rapide en le remplaçant std::sort()par un tri radix instable. Je ne sais pas quelle est la "version optimisée en mémoire" de quicksort, mais je doute qu'elle puisse être deux fois plus rapide que la version STL.

Ce billet de blog a évalué le tri radix ainsi que plusieurs autres algorithmes de tri. En bref, dans cette évaluation, il std::sort()faut 5,1 secondes pour trier 50 millions d'entiers, tandis que le tri radix sur place / instable prend 2,0 secondes. Le tri de radix stable devrait être encore plus rapide.

Le tri Radix est également largement utilisé pour trier les chaînes de manière stable. Des variantes de tri radix sont parfois vues pour la construction de tableaux de suffixes, BWT, etc.

user172818
la source