Question

Radix est une sorte théoriquement très rapide quand on sait que les clés sont dans une certaine gamme limitée, disons $ n valeurs $ dans la plage $ [0 \ points n ^ k -1] $ par exemple. Si $ k <\ logn vous $ juste convertir les valeurs à la base $ n $ qui a $ \ theta (n) $ temps, faire un $ de base n $ radix tri puis convertir à votre base d'origine pour un $ global \ Theta (nk) $ algorithme.

Cependant, j'ai lu que dans radix pratique est en quelque sorte généralement beaucoup plus lent que faire par exemple une étude randomisée quicksort :

Pour les grands tableaux, radix a en quelque sorte le nombre d'instructions plus bas, mais en raison de ses performances de cache relativement faible, son ensemble la performance est pire que les versions mémoire optimisées de mergesort et quicksort.

est un peu juste un radix bel algorithme théorique, ou at-il des utilisations pratiques communes?

Était-ce utile?

La solution

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

Sur chaque nœud du multiprocesseur que vous faites probablement quelque chose comme un tri rapide, mais permet radix de trier les stations de travail avec moins de synchronisation que les différentes sortes récursives.

Il y a d'autres situations aussi. Si vous avez besoin d'un tri stable (une sorte où chaque fois que deux clés sont égales, ils restent dans le même ordre plutôt que de se réarrangées) alors je ne suis pas au courant d'aucune version de quicksort qui sera d'utilisation. Mergesort est également stable (si elles sont appliquées correctement). Votre lien est la première fois que je l'ai jamais entendu quelqu'un dire que mergesort pourrait être fait pour avoir un meilleur comportement du cache de tri radix.

Autres conseils

@ Robert: Votre lien est assez surprenant (en fait, je ne pouvais pas trouver la phrase citée). Mon expérience personnelle est pour l'entrée au hasard, est une sorte radix beaucoup plus rapide que la STL std::sort(), qui utilise une variante de tri rapide. Je fabriquais un algorithme de 50% plus rapide en remplaçant std::sort() par une sorte de radix instable. Je ne sais pas quelle est la « version optimisée de la mémoire » de quicksort, mais je doute qu'il peut être deux fois plus rapide que la version STL.

Ce blog Evaluated radix sorte ainsi que plusieurs autres algorithmes de tri. En bref, dans cette évaluation, std::sort() prend 5,1 s pour trier 50 millions entiers, alors en place / radix instable prend 2,0 s sorte. sorte radix stable devrait être encore plus rapide.

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

Radix est en quelque sorte aussi une façon naturelle pour trier les mots de longueur fixe sur un alphabet fixe, par exemple dans Kärkkäinen & algorithme Sanders ( http: //www.cs.cmu. edu / ~ GuyB / RealWorld / papersS04 / KaSa03.pdf )

Licencié sous: CC-BY-SA avec attribution
Non affilié à cs.stackexchange
scroll top