Le tri prend O(n log n) dans le cas de la série. Si nous disposons de O(n) processeurs, nous pouvons espérer une accélération linéaire. Des algorithmes parallèles O(log n) existent mais ils ont une constante très élevée. Ils ne sont pas non plus applicables sur le matériel de base qui ne dispose pas de O(n) processeurs. Avec p processeurs, des algorithmes raisonnables devraient prendre O(n/p log n) temps.
Dans le cas du traitement en série, le tri rapide présente en moyenne la meilleure complexité d'exécution. Un algorithme de tri rapide parallèle est facile à implémenter (voir aquí y aquí ). Cependant, il n'est pas très performant car la toute première étape consiste à partitionner l'ensemble de la collection sur un seul cœur. J'ai trouvé des informations sur de nombreux algorithmes de tri parallèle, mais jusqu'à présent, je n'ai rien vu qui indique un vainqueur clair.
Je cherche à trier des listes de 1 à 100 millions d'éléments dans un langage JVM fonctionnant sur 8 à 32 cœurs.
1 votes
Je pense que tu as un N/P de trop dans ta liste de "à prendre".
0 votes
@Sparr Je ne le pense pas. Je fais une distinction entre avoir quelques processeurs et avoir autant de processeurs que d'éléments à trier.
0 votes
@CraigP.Motlin droit, mais vous semblez avoir "distribué" le /p de manière erronée. Il ne devrait y avoir qu'un seul /p.
0 votes
@Sparr Ah, j'ai changé ça, merci.
1 votes
@CraigP.Motlin Je pense que vous avez gardé le mauvais :)
0 votes
Pour trier de très grandes listes, je dirais que la meilleure performance dans le pire des cas serait une meilleure option. Si la moyenne est O(n log n) et que le pire cas est O(n^2), alors vous avez peut-être un problème !
0 votes
@CraigP.Motlin, la question sur le type d'éléments est importante pour déterminer quel type d'opérations peut être effectué sur eux. Parce que si les éléments sont des nombres entiers, alors le tri radix peut être appliqué, ce qui est
O(n)
pour un algorithme séquentiel, et la constante est petite lorsque la longueur des bits des nombres est petite (par exemple, des nombres de 16 bits). Il en va de même pour les chaînes de caractères. Un cas inapplicable est celui où les éléments, par exemple, ne peuvent être comparés que par paires. Il y a aussi des possibilités de vectorisation comme AVX à prendre en compte : bien que vous ne puissiez pas y accéder depuis Java.