Tri de nombres entiers

From Wikipedia, the free encyclopedia

En informatique, le tri de nombres entiers est le problème algorithmique consistant à trier une collection d'éléments au moyen de clés numériques, chacune étant un nombre entier. Les algorithmes conçus pour le tri des nombres entiers peuvent également souvent être appliqués aux problèmes de tri dans lesquels les clés sont des nombres décimaux, des nombres rationnels ou des chaînes de texte[1].

La possibilité d'effectuer une arithmétique sur les clés permet aux algorithmes de tri d'entiers d'être plus rapides que les algorithmes de tri par comparaison, en fonction du détail des opérations autorisées dans le modèle de calcul et de la taille des entiers à trier.

Les algorithmes de tri de nombres entiers, notamment le tri par paquets, le tri comptage et le tri par base, sont largement utilisés et pratiques.

D'autres algorithmes de tri de nombres entiers avec des limites de temps plus faibles dans le pire des cas ne sont pas considérés comme pratiques pour les architectures informatiques à 64 bits ou moins.

Beaucoup de ces algorithmes sont connus, les performances dépendant du nombre d'éléments à trier, du nombre de bits par clé et du nombre de bits par mot de l'ordinateur exécutant l'algorithme de tri.

Tri par rapport aux files de priorité d'entiers

La complexité temporelle des algorithmes de tri d’entiers dépend généralement de trois paramètres : le nombre n de valeurs à trier, la magnitude K de la clé la plus grande possible à trier et le nombre w de bits pouvant être représentés dans un seul mot machine de l'ordinateur sur lequel l'algorithme doit être exécuté. Typiquement, on suppose que w ≥ log2(max(n, K)) ; c'est-à-dire que les mots machine sont suffisamment grands pour représenter un index dans la séquence de données d'entrée, et également suffisamment grands pour représenter une clé unique[2].

Les algorithmes de tri de nombres entiers sont généralement conçus pour fonctionner soit dans la machine à pointeur, soit dans la machine RAM. La principale différence entre ces deux modèles réside dans la manière dont la mémoire peut être adressée. La machine RAM permet à toute valeur stockée dans un registre d'être utilisée comme adresse des opérations de lecture et d'écriture en mémoire, avec un coût unitaire par opération. Cette capacité permet à certaines opérations complexes sur les données d'être rapidement mises en œuvre à l'aide de recherches dans les tables. En revanche, dans le modèle de pointeur, les opérations de lecture et d'écriture utilisent les adresses stockées dans les pointeurs et il est interdit d'effectuer des opérations arithmétiques sur ces pointeurs. Dans les deux modèles, des valeurs de données peuvent être ajoutées et des opérations booléennes au niveau du bit et des opérations de décalage binaire peuvent généralement également être effectuées sur ces unités, en unités de temps par opération. Différents algorithmes de tri de nombres entiers supposent différentes hypothèses, toutefois, quant à savoir si la multiplication de nombres entiers est également autorisée en tant qu'opération temporelle[3]. D'autres modèles de calcul plus spécialisés, tels que la PRAM, ont également été envisagés[4].

Andersson, Miltersen & Thorup (1999) ont montré que, dans certains cas, les multiplications ou les recherches dans les tables requises par certains algorithmes de tri d'entiers pourraient être remplacées par des opérations personnalisées qui seraient plus facilement implémentées dans le matériel, mais qui ne sont généralement pas disponibles sur des ordinateurs polyvalents. Thorup (2003) amélioré ceci en montrant comment remplacer ces opérations spéciales par les instructions de manipulation de champs de bits déjà disponibles sur les processeurs Pentium.

Une file de priorité est une structure de données permettant de gérer un ensemble d'éléments munis de priorités numériques, comportant des opérations permettant de rechercher et de supprimer l'élément ayant la valeur de priorité minimale. Les files de priorité basées sur la comparaison, telles que le tas binaire, prennent un temps logarithmique par mise à jour, mais d'autres structures telles que l'arbre de van Emde Boas ou la file d'attente de compartiment peuvent être plus rapides pour les entrées dont les priorités sont de petits entiers. Ces structures de données peuvent être utilisées dans l'algorithme de tri par sélection, qui trie une collection d'éléments en recherchant et en supprimant de manière répétée le plus petit élément de la collection et en renvoyant les éléments dans l'ordre dans lequel ils ont été trouvés. Une file de priorité peut être utilisée pour gérer la collection d'éléments dans cet algorithme, et le temps pour cet algorithme sur une collection de n éléments peut être limité par le temps nécessaire pour initialiser la file de priorité, puis pour effectuer n opérations de recherche et suppression. Par exemple, l'utilisation d'un tas binaire comme file de priorité dans le tri par sélection conduit à l'algorithme de tri par tas, un algorithme de tri de comparaison de complexité temporelle en O(n log n) . Au lieu de cela, l'utilisation du tri par sélection avec une file d’attente donne une forme de tri par casier et l’utilisation d’arbres de Van Emde Boas ou d’autres files d’attente avec priorité entière conduit à d’autres algorithmes de tri d’entiers rapides. [5]

Au lieu d'utiliser une file de priorité d'entiers dans un algorithme de tri, il est possible d'aller dans la direction opposée et d'utiliser les tris d'entiers comme sous-routine dans une structure de données de file de priorité d'entiers. Thorup (2007) a utilisé cette idée pour montrer que, s'il est possible de réaliser le tri d'entiers en temps linéaire par clé alors cette même complexité s'applique aux opérations d'insertion et de suppression dans une file de priorité. La réduction de Thorup est complexe et s’appuie cependant sur l'existence d'une multiplication rapide ou d'une recherche rapide dans une table mais il donne une file de priorité alternative utilisant l'addition et les opérations sur les booléens en temps T(n) + T(log n) + T(log log n) + ... par opération, multipliant au plus le temps par un logarithme itéré.[5]

Utilisabilité

Les algorithmes classiques de tri des nombres entiers de type tri pigeonhole, tri comptage et tri par base sont largement utilisés et pratiques[6]. La plupart des recherches ultérieures sur les algorithmes de tri de nombres entiers ont été moins axées sur l'aspect pratique que sur les améliorations théoriques apportées à leur analyse des pires cas, et les algorithmes issus de cette ligne de recherche ne sont apparemment pas pratiques pour les architectures informatiques 64 bits actuelles, bien que des expériences ont montré que certaines de ces méthodes peuvent constituer une amélioration du tri de base pour les données de 128 bits ou plus par clé[6]. De plus, pour les grands ensembles de données, le modèle d'accès mémoire quasi aléatoire de nombreux algorithmes de tri d'entiers peuvent les handicaper par rapport aux algorithmes de tri de comparaison conçus pour la hiérarchie de mémoire[7].

Le tri de nombres entiers constitue l'un des six tests de performances en mathématiques discrètes de systèmes de calcul à haute productivité DARPA [8] et l'un des onze points de repère de la suite de tests de performances NAS .

Algorithmes pratiques

Algorithmes théoriques

Références

Related Articles

Wikiwand AI