web-dev-qa-db-fra.com

Qu'est-ce que la stabilité dans les algorithmes de tri et pourquoi est-ce important?

Je suis très curieux de savoir pourquoi la stabilité est importante ou non dans les algorithmes de tri.

218
DarthVader

Un algorithme de tri est dit stable si deux objets avec des clés identiques apparaissent dans le même ordre dans la sortie triée comme ils apparaissent dans le tableau en entrée à trier. Certains algorithmes de tri sont stables par nature, comme le tri par insertion, le tri par fusion, le tri à bulles, etc. Certains algorithmes de tri ne sont pas, comme le tri par tas, le tri rapide, etc.

Arrière-plan : un algorithme de tri "stable" maintient les éléments avec la même clé de tri dans l'ordre. Supposons que nous ayons une liste de mots de 5 lettres:

Peach
straw
Apple
spork

Si nous trions la liste uniquement par la première lettre de chaque mot, un tri stable produira:

Apple
Peach
straw
spork

Dans un algorithme de tri instable, straw ou spork peuvent être échangés, mais dans un état stable, ils restent dans les mêmes positions relatives (c.-à-d., Puisque straw apparaît avant spork dans l'entrée, il apparaît également avant spork dans la sortie).

Nous pourrions trier la liste de mots en utilisant cet algorithme: tri stable par colonne 5, puis 4, puis 3, puis 2, puis 1. Finalement, il sera trié correctement. Convainquez-vous de cela. (au fait, cet algorithme s'appelle une sorte de base)

Maintenant, pour répondre à votre question, supposons que nous ayons une liste de prénoms et de noms. On nous demande de trier "par nom de famille, puis par premier". Nous pourrions d'abord trier (stable ou instable) par le prénom, puis le tri stable par le nom de famille. Après ces tris, la liste est principalement triée par nom de famille. Toutefois, lorsque les noms de famille sont identiques, les prénoms sont triés.

Vous ne pouvez pas empiler des tris instables de la même manière.

286
Joey Adams

Un algorithme de tri stable est celui qui trie les éléments identiques dans le même ordre d'apparition dans l'entrée, tandis que le tri est instable ne peut pas satisfaire le cas.

Algorithmes de tri stables:

  • Tri par insertion
  • Tri par fusion
  • Tri à bulles
  • Tim Sort
  • Compter le tri

Algorithmes de tri instables:

  • Sorte de tas
  • Tri de sélection
  • Sorte de coquille
  • Tri rapide

enter image description here

39
snr

La stabilité du tri signifie que les enregistrements avec la même clé conservent leur ordre relatif avant et après le tri.

La stabilité est donc importante si et seulement si le problème que vous résolvez nécessite le maintien de cet ordre relatif.

Si vous n'avez pas besoin de stabilité, vous pouvez utiliser un algorithme rapide de récupération de mémoire d'une bibliothèque, comme un tas ou un tri rapide, et l'oublier.

Si vous avez besoin de stabilité, c'est plus compliqué. Les algorithmes stables ont une utilisation plus importante du processeur et/ou de la mémoire big-O que les algorithmes instables. Ainsi, lorsque vous avez un grand ensemble de données, vous devez choisir entre battre le processeur ou la mémoire. Si vous êtes limité par le processeur et la mémoire, vous avez un problème. Un bon algorithme stable de compromis est une sorte d'arbre binaire; le article Wikipedia a une implémentation C++ pathétiquement facile basée sur le STL.

Vous pouvez transformer un algorithme instable en un algorithme stable en ajoutant le numéro de l'enregistrement d'origine en tant que clé de la dernière place pour chaque enregistrement.

18
Bob Murphy

Il y a quelques raisons pour lesquelles la stabilité peut être importante. La première est que, si deux enregistrements ne doivent pas être échangés, vous pouvez provoquer une mise à jour de la mémoire, une page est marquée comme sale et doit être ré-écrite sur le disque (ou un autre support lent).

15
Clinton Pierce

Cela dépend de ce que vous faites.

Imaginez que vous ayez des enregistrements de personnes avec un champ prénom et un nom de famille. D'abord, vous triez la liste par prénom. Si vous triez ensuite la liste avec un algorithme stable par nom de famille, vous obtiendrez une liste triée par prénom ET nom de famille.

14
svens

Un algorithme de tri est dit stable si deux objets avec des clés identiques apparaissent dans le même ordre dans la sortie triée, comme ils apparaissent dans le tableau d'entrée non trié. Certains algorithmes de tri sont stables par nature, comme le tri par insertion, le tri par fusion, le tri à bulles, etc. Certains algorithmes de tri ne le sont pas, comme le tri par tas, le tri rapide, etc.

Cependant, tout algorithme de tri non stable peut être modifié pour être stable. Il peut exister des méthodes de tri spécifiques pour la stabiliser, mais en général, tout algorithme de tri basé sur la comparaison qui n'est pas stable par nature peut être modifié pour devenir stable en modifiant l'opération de comparaison de clé de sorte que la comparaison de deux clés considère la position comme facteur pour les objets avec des clés égales.

Références: http://www.math.uic.edu/~leon/cs-mcs401-s08/handouts/stability.pdfhttp://en.wikipedia.org/wiki/Algorithme de tri # Stabilité

4
roottraveller

Je sais qu'il y a beaucoup de réponses à cela, mais pour moi, cette réponse , par Robert Harvey , résumez-le beaucoup plus clairement:

Une sorte stable est une sorte qui préserve l'ordre d'origine du jeu d'entrées, où l'algorithme [unstable] ne fait pas la distinction entre deux ou plusieurs éléments.

Source

3
John R Perry

Si vous supposez que ce que vous triez ne sont que des nombres et que seules leurs valeurs les identifient/les distinguent (par exemple, les éléments avec la même valeur sont identiques), le problème de la stabilité du tri n'a donc aucun sens.

Cependant, les objets avec la même priorité de tri peuvent être distincts, et parfois leur ordre relatif est une information significative. Dans ce cas, le tri instable génère des problèmes.

Par exemple, vous avez une liste de données contenant le coût en temps [T] de tous les joueurs pour nettoyer un labyrinthe de niveau [L] dans une partie. Supposons que nous devions classer les joueurs en fonction de la rapidité avec laquelle ils nettoient le labyrinthe. Cependant, une règle supplémentaire s'applique: les joueurs qui nettoient le labyrinthe avec un niveau supérieur ont toujours un rang plus élevé, peu importe la durée.

Bien sûr, vous pouvez essayer de mapper la valeur appariée [T, L] à un nombre réel [R] avec un algorithme qui suit les règles, puis de classer tous les joueurs avec la valeur [R].

Cependant, si un tri stable est possible, vous pouvez simplement trier toute la liste par [T] (lecteurs les plus rapides en premier), puis par [L]. Dans ce cas, l'ordre relatif des joueurs (par coût temporel) ne sera pas modifié après les avoir regroupés par niveau de labyrinthe nettoyé.

PS: Bien sûr, l’approche consistant à trier deux fois n’est pas la meilleure solution à un problème particulier, mais expliquer la question de l’affiche devrait suffire.

1
M Ciel

Un tri stable retournera toujours la même solution (permutation) sur la même entrée.

Par exemple, [2,1,2] sera trié en utilisant une sorte stable comme permutation [2,1,3] (d’abord l’indice 2, puis l’indice 1, puis l’indice 3 dans la sortie triée). Cela signifie que la sortie est toujours mélangée de la même manière. L'autre permutation non stable, mais toujours correcte, est [2,3,1].

Le tri rapide n'est pas un tri stable et les différences de permutation entre les mêmes éléments dépendent de l'algorithme de sélection du pivot. Certaines implémentations sont choisies de manière aléatoire et permettent un tri rapide donnant différentes permutations sur la même entrée en utilisant le même algorithme.

Un algorithme de tri stable est nécessaire déterministe.

0
Luka Rahne