Qu'est-ce que la stabilité dans les algorithmes de tri et pourquoi est-il important?
Je suis très curieux, pourquoi la stabilité est ou n'est pas important dans les algorithmes de tri?
- Pour la parallélisation des fins? par exemple: fusion de tri est stable et peut être parallélisée bien et est donc quicksort.
- Classique QuickSort est instable
- tri stable algo -
IBM (Insertion, Bubble, Merge)
- excusez-moi?
- Une remarque pour ceux qui pourraient mal compris le concept comme moi: L'ordre des éléments égaux est assuré d'être préservé. moyens: si les éléments stables de tri sont considérés comme égaux, alors ils suivent la commande précédente. pas ce que j'ai l'habitude de penser: si les éléments dans l'ordre précédent, sont considérés comme égaux, puis dans les prochains tri stable, ils suivent la commande précédente. Si vous pouvez trouver la dernière acception aussi du sens dans de nombreux cas.
Vous devez vous connecter pour publier un commentaire.
Un algorithme de tri est dit être stable si deux objets avec l'égalité des clés apparaissent dans le même ordre de tri de sortie tels qu'ils apparaissent dans le tableau à trier. Certains algorithmes de tri sont stables par nature, comme le tri par Insertion, de Fusion et de Tri, Tri à Bulles, etc. Et certains algorithmes de tri ne sont pas, comme les Tas de Tri, Tri Rapide, etc.
Fond: une "stabilité" algorithme de tri qui conserve les éléments avec la même clé de tri dans l'ordre. Supposons que nous avons une liste de 5 lettres les mots:
Si nous trier la liste par juste la première lettre de chaque mot, puis un stable de sorte donnerait:
Dans un instable algorithme de tri,
straw
ouspork
peuvent être confondus, mais dans une version stable, ils restent dans les mêmes positions relatives (qui est, depuisstraw
apparaît avantspork
dans l'entrée, il apparaît aussi avantspork
dans la sortie).On peut trier la liste des mots à l'aide de cet algorithme: stable tri par colonne 5, puis 4, puis 3, puis 2, puis 1.
En fin de compte, il sera triée correctement. Laissez-vous convaincre de cela. (en passant, que l'algorithme est appelé tri radix)
Maintenant pour répondre à votre question, supposons que nous avons une liste de noms et de prénoms. On nous demande de trier "par nom de famille, puis par la première". Nous pourrions tout d'abord trier (stable ou instable) par le nom de la première, puis tri stable par le dernier nom. Après ces sortes, la liste est principalement triées par ordre de nom de famille. Toutefois, lorsque les noms sont les mêmes, les premiers noms sont triés.
Vous ne pouvez pas pile instable sortes de la même manière.
straw
etspork
comparer l'égalité. Tri Stable à préserver l'ordre d'entrée, alors que le tri instable ne fait pas de cette garantie. "Correct" dépend de l'application. La fonction de tri dans la plupart des langages de programmation permet à l'utilisateur de fournir une coutume fonction de commande. Si l'utilisateur de la fonction de la traite différents articles comme des égaux (même prénom, nom de famille différent), il est utile de savoir si l'ordre original sera conservé. Voir OCaml matrice de fonctions de tri pour un exemple réel.spork
ne viennent avantstraw
, sauf si vous êtes seulement de tri par la première lettre. Pour moi ce n'est pas une façon naturelle de trier les chaînes et devrait être clair.Stable algorithme de tri est celui qui trie les éléments identiques dans le même ordre qu'elles apparaît dans l'entrée, tandis que instables tri peut pas satisfaire le cas.
Stable Algorithmes De Tri:
Instable Algorithmes De Tri:
De tri de la stabilité signifie que les enregistrements ayant la même clé de conserver leur commande avant et après le tri.
Alors la stabilité des questions si, et seulement si, le problème que vous avez des problèmes exige de rétention de l'ordre relatif.
Si vous n'avez pas besoin de la stabilité, vous pouvez utiliser un rapide, la mémoire en sirotant algorithme à partir d'une bibliothèque, comme heapsort ou quicksort, et de l'oublier.
Si vous avez besoin de stabilité, c'est plus compliqué. Stable algorithmes ont plus grand-O CPU et/ou de l'utilisation de la mémoire que instables algorithmes. Ainsi, lorsque vous avez un grand ensemble de données, vous avez à choisir entre vaincre le CPU ou de la mémoire. Si vous êtes limité sur les deux CPU et de la mémoire, vous avez un problème. Un bon compromis stable algorithme est un arbre binaire de tri; l' Article de Wikipedia a un pathétiquement facile implémentation C++ basé sur la STL.
Vous pouvez faire de l'instabilité de l'algorithme dans un stable par l'ajout de l'enregistrement d'origine numéro de la dernière place de la clé pour chaque enregistrement.
Il y a peu de raisons de stabilité peut être important. L'une est que, si deux enregistrements ne doivent pas être échangé en échangeant entre eux, vous pouvez provoquer un mémoire de mise à jour, une page est marqué sale et doit être ré-écrite sur le disque (ou un autre lent, moyen).
Cela dépend de ce que vous faites.
Imaginez que vous avez certaines personnes enregistrements avec un premier et un dernier champ nom. D'abord de trier la liste par nom de famille. Ensuite, si vous le tri de la liste avec un algorithme stable par nom de famille, vous aurez une liste triée par nom ET prénom.
Un algorithme de tri est dit stable si deux objets avec l'égalité des clés apparaissent dans le même ordre de tri de sortie tels qu'ils apparaissent dans l'entrée des ménagères de tableau. Certains algorithmes de tri sont stables par nature, comme le tri par Insertion, de Fusion et de Tri, Tri à Bulles, etc. Et certains algorithmes de tri ne sont pas, comme les Tas de Tri, Tri Rapide, etc.
Cependant, tout algo de tri qui n'est pas stable peut être modifié pour être stable. Il peut y avoir des algo de tri des moyens spécifiques pour le rendre stable, mais en général, toute comparaison basée algorithme de tri qui n'est pas stable, par nature, peut être modifié pour être stable par changement de la clé de l'opération de comparaison, de sorte que la comparaison de deux touches considère position en tant que facteur d'objets avec l'égalité des touches.
Références:
http://www.math.uic.edu/~leon/cs-mcs401-s08/documents/stabilité.pdf
http://en.wikipedia.org/wiki/Sorting_algorithm#Stability
Je sais qu'il y a beaucoup de réponses, mais pour moi, cette réponse, par Robert Harvey, résume beaucoup plus clairement:
Source
Si vous assumez ce que vous êtes de tri sont seulement des nombres et seulement leurs valeurs identifier et de les distinguer (p. ex. les éléments avec la même valeur sont identicle), alors la stabilité de la question de triage vide de sens.
Toutefois, les objets avec la même priorité dans le tri peut être distincts, et parfois leur ordre relatif est de l'information significative. Dans ce cas, l'instabilité de tri génère des problèmes.
Par exemple, vous avez une liste de données qui contient le coût du temps [T] de tous les joueurs pour nettoyer un labyrinthe avec le Niveau [L] dans un jeu.
Supposons que nous avons besoin de classer les joueurs par la vitesse à laquelle ils nettoient le labyrinthe. Cependant, une autre règle s'applique: les joueurs qui nettoient le labyrinthe de haut niveau ont toujours un rang plus élevé, peu importe combien de temps le coût du temps est.
Bien sûr, vous pouvez essayer de mapper les paires de valeur [L,L] pour un nombre réel [R] avec un algorithme qui suit les règles et ensuite classer tous les joueurs avec [R] de la valeur.
Toutefois, si stable que le tri est possible, alors vous pouvez simplement trier la liste par [T] (joueurs plus Rapides en premier), puis par [L]. Dans ce cas, l'ordre relatif des joueurs (par le temps, coût) ne pourront être modifiés une fois regroupés par niveau de labyrinthe, ils ont nettoyé.
PS: bien sûr, l'approche de trier par deux fois n'est pas la meilleure solution au problème en particulier, mais pour expliquer la question de l'affiche, il devrait être suffisant.
Tri Stable retournera toujours la même solution (permutation) sur la même entrée.
Par exemple [2,1,2] seront triés à l'aide de tri stable que la permutation de [2,1,3] (la première est d'indice 2, puis à l'indice 1 indice, puis 3 dans triés en sortie) Qui signifie que la sortie est toujours mélangé de la même manière. D'autres non stable, mais toujours correct permutation est [2,3,1].
Tri rapide n'est pas stable, de tri et de permutation des différences entre les mêmes éléments dépend de l'algorithme de pivot pour la cueillette. Certaines implémentations de ramasser au hasard et qui peut faire de rapide de tri de rendement de permutations différentes sur la même entrée en utilisant le même algorithme.
Stable algorithme de tri est nécessaire déterministe.
sort([(5,3),(1,5),(3,3),(1,3)], x) => [(1,5),(1,3),(3,3),(5,3)]
. Je peux faire un déterministe sorte que toujours (approche déterministe) sorties:[(1,3),(1,5),(3,3),(5,3)]
mais ce n'est pas un tri stable.