logo

Tri temporel linéaire

Introduction

Le tri est une opération essentielle en informatique qui consiste à ranger les éléments dans un ordre précis, tel que l'ordre numérique ou alphabétique. Différents algorithmes de tri ont été développés, chacun avec des indicateurs de temps et d'efficacité. Le tri temporel linéaire est un sous-ensemble d'algorithmes de tri présentant un avantage significatif : ils peuvent trier un ensemble donné d'éléments en temps linéaire, le temps d'exécution augmente linéairement avec la taille d'entrée.

L’algorithme de tri temporel linéaire le plus connu est le tri décroissant. Le tri informatique est particulièrement efficace lorsque la plage d’éléments d’entrée est connue et relativement petite. Cela élimine le besoin de comparer les éléments, la principale opération fastidieuse dans de nombreux autres algorithmes de tri. En utilisant la connaissance du domaine d'entrée, le tri informatique atteint une complexité temporelle linéaire. Un tri numérique analyse d'abord le tableau d'entrée pour déterminer le nombre de chaque élément. Il utilise ensuite ces nombres pour calculer les positions correctes des éléments dans le tableau des résultats ordonnés. L'algorithme comprend les étapes suivantes :

  1. Pour déterminer la plage, identifiez les valeurs minimale et maximale du tableau d'entrée.
  2. Créez une feuille de calcul initialisée avec la taille de la plage et les zéros.
  3. Parcourez le tableau d'entrée et incrémentez chaque élément trouvé.
  4. Modifiez la feuille de calcul en calculant le total cumulé pour obtenir les positions correctes pour chaque élément.
  5. Créez un tableau de sortie de la même taille que le tableau d'entrée.
  6. Déplacez à nouveau le tableau d'entrée, en plaçant chaque élément dans la position correcte dans le tableau de sortie en fonction de la feuille de calcul.
  7. La table de résultats contient désormais des éléments triés.
Tri temporel linéaire

Le principal avantage du tri décroissant est qu’il atteint une complexité temporelle linéaire de O(n), ce qui le rend très efficace pour les grandes tailles d’entrée. Cependant, son applicabilité est limitée aux scénarios dans lesquels le choix des éléments d’entrée est connu à l’avance et relativement restreint.

Il est important de noter que d’autres algorithmes de tri, tels que le tri rapide ou la fusion, ont généralement une complexité temporelle de O(n log n), ce qui est considéré comme efficace pour de nombreuses applications pratiques. Les algorithmes de tri temporel linéaire, tels que le tri numérique, offrent une alternative lorsque certaines contraintes ou propriétés de l'entrée permettent d'utiliser une complexité temporelle linéaire.

Histoire

Les algorithmes de tri temporel linéaire ont une riche histoire en informatique. Le développement de l’ordre du temps linéaire remonte au milieu du XXe siècle et les contributions des scientifiques et des mathématiciens ont été significatives. L'un des premiers algorithmes de tri temporel linéaire est le tri par compartiments, proposé par Harold H. Seward en 1954. Un tri par compartiments divise les éléments d'entrée en un nombre fini de compartiments, puis trie chaque compartiment séparément. Cet algorithme a une complexité temporelle linéaire si la distribution des éléments d'entrée est relativement uniforme.

0,2 en fraction

En 1959, Kenneth E. Iverson a introduit un algorithme de base qui permet d'obtenir une complexité temporelle linéaire. Radix trie les éléments par leurs nombres ou signes du moins significatif au plus significatif. Il utilise des algorithmes de tri robustes, tels que le tri numérique ou par compartiment, pour trier les éléments à chaque emplacement de chiffre. Le tri Radix est devenu populaire à l’ère des cartes perforées et des premiers systèmes informatiques. Cependant, l'algorithme de tri temporel linéaire le plus connu est une énumération, introduite par Harold H. Seward et Peter Elias en 1954 et redécouverte plus tard indépendamment par Harold H. « Bobby » Johnson en 1961. Le tri numérique a reçu une attention considérable.

Ceci est particulièrement efficace lorsque la gamme d’éléments d’entrée est connue et relativement petite. L’histoire du tri temporel linéaire s’est poursuivie avec le développement d’autres algorithmes spécialisés. Par exemple, en 1987, Hanan Samet a proposé le tri par arbre de distribution binaire, un algorithme de tri temporel linéaire pour les données multidimensionnelles. Au fil des années, les chercheurs ont continué à étudier et à améliorer les algorithmes de planification linéaire, en se concentrant sur des scénarios et des contraintes spécifiques. Bien que des algorithmes tels que le tri rapide et la fusion soient plus largement utilisés pour leur efficacité dans un plus grand nombre de scénarios, les algorithmes de tri temporel linéaire offrent des alternatives précieuses lorsque certaines circonstances permettent d'exploiter la complexité du temps linéaire. En général, l’histoire du tri temporel linéaire se caractérise par la recherche d’algorithmes efficaces capables de trier de grands ensembles de données en temps linéaire, surmontant ainsi les limites des algorithmes de tri basés sur la comparaison. Les contributions de différents chercheurs ont ouvert la voie au développement et à la compréhension de ces techniques de tri spécialisées.

Types de tri temporel linéaire

Il existe plusieurs algorithmes de tri temporel linéaire différents. Les deux principaux types sont les algorithmes basés sur le nombre et les algorithmes basés sur la base. Voici les algorithmes de tri temporel linéaire les plus courants, classés en fonction des types suivants :

Algorithmes basés sur le comptage

    Tri basé sur le comptage :Counting-Based est un algorithme de tri non comparatif. Il compte l'occurrence de chaque élément particulier dans le tableau d'entrée et utilise ces informations pour déterminer la position correcte de chaque élément dans le tableau de sortie trié. Le tri basé sur le comptage suppose que les éléments d'entrée sont des entiers ou peuvent être ajoutés à des entiers.

Algorithmes basés sur des bases

    Trier la base :Radix Sort est un algorithme de tri sans comparaison qui trie les éléments par leurs nombres ou leurs caractères. Il compte chaque nombre ou signe dans les éléments du nombre le moins significatif au plus significatif. Le tri radical suppose que les éléments d'entrée sont des entiers ou des chaînes.Tri par seau :Bucket Sort est une variante de Radix Sort qui divise les éléments en groupes fixes en fonction de leur plage ou de leur distribution. Chaque segment est trié séparément à l'aide d'un algorithme de tri différent ou d'un tri récursif.Tri par base MSD (chiffre le plus significatif) :MSD Radix Sort est une variante du tri par base qui commence à trier les éléments en fonction de leur poids le plus significatif. Il divise récursivement les éléments en sous-groupes en fonction de la valeur du nombre actuel et applique MSD Radix Sort à chaque sous-groupe jusqu'à ce que tous les nombres aient été comptés.Tri par base LSD (chiffre le moins significatif) :LSD Radix Sort est une autre variante qui commence à trier les éléments en fonction de leur poids le moins significatif. Il trie de manière récursive les éléments en fonction de chaque nombre de l'extrême droite à l'extrême gauche, produisant un résultat trié. Les algorithmes de tri basés sur le nombre et sur la racine atteignent une complexité temporelle linéaire en exploitant des propriétés spécifiques des éléments d'entrée, telles que leur plage ou leur structure de représentation (par exemple, des nombres ou des caractères). Cependant, leur applicabilité peut varier en fonction des caractéristiques des données d'entrée.

Avantages du tri temporel linéaire

Les algorithmes de tri temporel linéaire, tels que le tri numérique, offrent plusieurs avantages dans des scénarios spécifiques.

    Efficace pour les grandes tailles d’entrée :La complexité temporelle des algorithmes de tri temporel linéaire est O(n), ce qui signifie que le temps d'exécution augmente linéairement avec la taille de l'entrée. Cela les rend très efficaces pour les grands ensembles de données par rapport aux algorithmes de tri basés sur des comparaisons tels que les algorithmes de tri rapide ou de fusion, qui ont généralement une complexité temporelle de O(n log n).Aucune opération de comparaison :Les algorithmes de tri temporel linéaire, tels que le tri par énumération, ne reposent pas sur une comparaison élémentaire. Ils utilisent plutôt des attributs ou des informations spécifiques sur les éléments d'entrée, tels que leur étendue ou leur distribution. Cette fonctionnalité les rend avantageux lorsque le coût de comparaison est élevé, comme pour des objets complexes ou des opérations de comparaison coûteuses.Adéquation à des propriétés d’entrée spécifiques :Les algorithmes de tri temporel linéaire ont souvent des exigences ou des hypothèses spécifiques concernant les éléments d'entrée. Par exemple, pour calculer un ordre de tri, vous devez connaître à l’avance la plage des éléments d’entrée. Lorsque ces conditions sont remplies, les algorithmes de tri temporel linéaire peuvent offrir des avantages significatifs en termes de performances par rapport aux algorithmes de tri généraux.Tri stable :De nombreux algorithmes de tri temporel linéaire, y compris le tri numérique et par base, sont intrinsèquement stables. La cohérence signifie que les éléments avec des clés ou des valeurs en double conservent un ordre relatif dans la sortie triée. Cela peut être critique lors du tri d'objets ou d'enregistrements avec plusieurs attributs ou lorsqu'il est essentiel de préserver l'ordre d'origine des éléments de valeur égale.Facilité d'utilisation:Les algorithmes de tri temporel linéaire tels que le tri par énumération sont souvent relativement faciles à mettre en œuvre par rapport aux algorithmes de tri plus complexes basés sur des comparaisons. Ils peuvent être plus faciles à comprendre et à déboguer, ce qui les rend adaptés aux situations où la simplicité et la clarté sont souhaitées.

Inconvénients du tri temporel linéaire

Bien que les algorithmes d’ordonnancement linéaire présentent des avantages, ils présentent également certaines limites et inconvénients :

    Exigences de saisie contraignantes :Les algorithmes de tri temporel linéaire ont souvent des exigences ou des hypothèses spécifiques concernant les éléments d'entrée. Par exemple, pour calculer un ordre de tri, vous devez connaître à l’avance la plage des éléments d’entrée. Cette restriction limite leur applicabilité aux situations où ces conditions sont remplies. Les besoins en mémoire peuvent devenir peu pratiques ou dépasser les ressources disponibles si la plage est étendue ou inconnue.Exigences d'espace supplémentaires :Certains algorithmes de tri temporel linéaire, tels que le tri numérique, nécessitent un espace supplémentaire pour stocker d'autres tableaux ou structures de données. L'espace requis est souvent proportionnel au nombre d'éléments d'entrée. Cela peut être un inconvénient lorsque l'utilisation de la mémoire est un problème, en particulier lorsqu'il s'agit de grands ensembles de données ou de ressources mémoire limitées.Manque de polyvalence :Les algorithmes de tri temporel linéaire sont des algorithmes spécialisés conçus pour des scénarios ou des contraintes spécifiques. Ils devront peut-être être plus adaptés et plus efficaces pour les tâches de tri générales ou pour différentes distributions d'entrées. Les algorithmes de tri basés sur des comparaisons, tels que le tri rapide ou la fusion, sont plus polyvalents et peuvent gérer une plage de saisie plus large.Inefficace pour les petites plages ou les données clairsemées :Les algorithmes de tri temporel linéaire tels que l’énumération sont plus efficaces lorsque la plage d’éléments d’entrée est petite et densément distribuée. Si la plage est étendue ou si les données sont rares (c'est-à-dire seulement quelques valeurs distinctes), l'algorithme peut économiser du temps et des efforts en traitant des parties vides ou peu peuplées de la plage d'entrée.Limité à des types de données spécifiques :Les algorithmes de tri temporel linéaire, tels que le tri par énumération, sont principalement conçus pour trier des entiers non négatifs ou des objets clé-valeur. Ils peuvent ne pas convenir au tri d'autres types de données, tels que les nombres à virgule flottante, les chaînes ou les structures de données complexes. L'adaptation d'algorithmes de tri temporel linéaire pour gérer différents types de données ou des fonctions de comparaison personnalisées peut nécessiter un prétraitement ou des modifications supplémentaires.

Lors du choix d'un algorithme de tri, il est essentiel de considérer attentivement les spécificités des données d'entrée et les exigences du problème de tri. Bien que les algorithmes de planification linéaire offrent des avantages dans des scénarios spécifiques, ils ne constituent que parfois le choix le plus approprié ou le plus efficace.

réseau neuronal artificiel

Applications des algorithmes de tri temporel linéaire

Les algorithmes de tri temporel linéaire sont efficaces et ont de nombreuses applications dans divers domaines. Voici quelques applications typiques de l’ordre temporel linéaire :

    Tri des entiers à petite plage :Les algorithmes de tri temporel linéaire, tels que le tri par nombre et le tri par base, sont idéaux pour trier des tableaux d'entiers lorsque la plage de valeurs est de 10 à 10. Ces algorithmes atteignent une complexité temporelle linéaire en faisant des hypothèses sur les données d'entrée, leur permettant ainsi de contourner le tri basé sur la comparaison.Tri des chaînes :Des algorithmes de tri temporel linéaire peuvent également être appliqués pour trier efficacement les chaînes. En prenant des propriétés uniques des chaînes, telles que leur longueur ou leurs caractères, des algorithmes tels que Radix Sort peuvent atteindre une complexité temporelle linéaire lors du tri des chaînes.Fonctions de base de données :Le tri est une fonction essentielle des algorithmes de tri temporel linéaire qui peuvent trier efficacement de grands ensembles de données en fonction de colonnes ou de champs spécifiques. Cela permet un traitement des requêtes plus rapide et de meilleures performances dans les opérations de base de données.Création d'histogrammes :Les histogrammes sont essentiels pour diverses tâches statistiques et d'analyse de données. Les algorithmes de tri temporel linéaire, tels que le tri numérique, peuvent générer des histogrammes en comptant efficacement les occurrences d'éléments dans un ensemble de données.Tri externe :La technique de tri externe est utilisée dans les scénarios où les données ne peuvent pas tenir entièrement en mémoire. Les algorithmes de tri temporel linéaire tels que le tri par base externe ou le tri par comptage externe peuvent trier efficacement de grands ensembles de données stockés sur disque ou sur d'autres périphériques de stockage externes.Planification d'événements :Les algorithmes de tri temporel linéaire peuvent planifier des événements en fonction de leur heure de début ou de fin. Le tri des événements par ordre croissant facilite l'identification des conflits, des périodes qui se chevauchent ou la recherche de la prochaine période disponible.Analyse des fichiers journaux :L'analyse des fichiers journaux est une tâche courante dans l'administration système et le débogage. Des algorithmes de tri temporel linéaire peuvent être utilisés pour trier les journaux en fonction d'horodatages, ce qui facilite l'identification de modèles, d'anomalies ou la recherche d'événements spécifiques.Compression des données :Le tri joue un rôle essentiel dans diverses techniques de compression de données. Des algorithmes tels que la transformation de Burrows-Wheeler (BWT) ou la transformation Move-To-Front (MTF) s'appuient sur un ordre temporel linéaire pour réorganiser les données afin d'améliorer l'efficacité de la compression. Ce ne sont là que quelques exemples d’applications d’algorithmes de tri temporel linéaire.

Implémentation du tri temporel linéaire en C++

Voici un exemple de programme implémentant Counting Sort, qui est un algorithme de tri temporel linéaire :

 #include #include using namespace std; void countingSort(vector&amp; arr) { // Find the maximum element in the array int max_val = *max_element(arr.begin(), arr.end()); // Create a count array to store the count of each element vector count(max_val + 1, 0); // Count the occurrences of each element for (int num : arr) { count[num]++; } // Compute the prefix sum for (int i = 1; i <count.size(); i++) { count[i] +="count[i" - 1]; } create a sorted output array vector output(arr.size()); place the elements in order for (int i="arr.size()" 1;>= 0; i--) { output[count[arr[i]] - 1] = arr[i]; count[arr[i]]--; } // Copy the sorted elements back to the original array for (int i = 0; i <arr.size(); i++) { arr[i]="output[i];" } int main() vector arr="{4," 2, 8, 3, 1}; sort the array using counting countingsort(arr); print sorted cout << 'sorted array: '; for (int num : arr) ' endl; return 0; < pre> <p> <strong>Sample Output</strong> </p> <pre> Sorted array: 1 2 2 3 3 4 8 </pre> <p>This indicates that the input array has been sorted in ascending order using the Counting Sort algorithm, resulting in the sorted array [1, 2, 2, 3, 3, 4, 8].</p> <p>In this C++ program, the counting sort function takes a reference to the vector arr and runs the counting sort routine. It finds the table&apos;s maximum value to determine the worksheet&apos;s size. It then counts each element&apos;s occurrence and calculates the worksheet&apos;s prefix sum. Then, it creates a result vector and puts the elements in order according to the worksheet. Finally, it copies the sorted elements back into the original array. In the primary function, the example array {4, 2, 2, 8, 3, 3, 1} is sorted by the enumeration sort algorithm and printed as a sorted matrix. Note that the program uses libraries to work with vectors and find the maximum element of an array using the max_element function.</p> <hr></arr.size();></count.size();>

Cela indique que le tableau d'entrée a été trié par ordre croissant à l'aide de l'algorithme Counting Sort, ce qui a donné le tableau trié [1, 2, 2, 3, 3, 4, 8].

Dans ce programme C++, la fonction de tri par comptage prend une référence au vecteur arr et exécute la routine de tri par comptage. Il trouve la valeur maximale du tableau pour déterminer la taille de la feuille de calcul. Il compte ensuite l'occurrence de chaque élément et calcule la somme des préfixes de la feuille de calcul. Ensuite, il crée un vecteur de résultat et met les éléments dans l'ordre selon la feuille de calcul. Enfin, il copie les éléments triés dans le tableau d'origine. Dans la fonction principale, l'exemple de tableau {4, 2, 2, 8, 3, 3, 1} est trié par l'algorithme de tri par énumération et imprimé sous forme de matrice triée. Notez que le programme utilise des bibliothèques pour travailler avec des vecteurs et trouver l'élément maximum d'un tableau à l'aide de la fonction max_element.