Exactement combien de comparaisons ne de fusion tri faire?
J'ai lu que quicksort est beaucoup plus rapide que mergesort dans la pratique, et la raison pour cela est le caché constante.
Eh bien, la solution pour l'essai à répartition aléatoire rapide de tri de la complexité est 2nlnn=1.39 nlogn qui signifie que la constante dans quicksort est de 1,39.
Mais qu'en est mergesort?
Qu'est-ce que la constante dans mergesort?
- Cette question n'a pas une réponse, sans plus de détails. La réponse est depndent sur (1) la définition de la complexité: nombre d'ops? nombre de comparaisons? (2) la réponse peut différer entre les différentes machines, selon les instructions de chaque machine.
- Le nombre de comparaisons de cours.
Vous devez vous connecter pour publier un commentaire.
Nous allons voir si nous pouvons faire ce travail!
Dans la fusion de tri, à chaque niveau de la récursivité, nous ne les suivants:
Alors, comment de nombreuses comparaisons sont effectuées à chaque étape? Ainsi, la fracture étape ne pas faire de comparaisons; simplement, il divise le tableau en deux. L'étape 2 n'est pas (directement) rend la comparaison; toutes les comparaisons sont faites par des appels récursifs. Dans l'étape 3, nous avons deux matrices de taille n/2 et le besoin de les fusionner. Cela nécessite tout au plus n comparaisons, puisque chaque étape de l'algorithme de fusion fait une comparaison, puis consomme une partie de l'élément de tableau, donc on ne peut pas faire plus que n comparaisons.
La combinaison de cet ensemble, on obtient l'récurrence:
(Comme mentionné dans les commentaires, le terme linéaire est plus précisément (n - 1), bien que cela ne change pas la conclusion générale. Nous allons utiliser au-dessus de la récidive, comme une limite supérieure.)
Pour simplifier, nous allons définir n = 2k et la réécriture de cette récurrence en termes de k:
Les premiers termes sont ici 0, 2, 8, 24, ... . Cela ressemble à quelque chose comme k 2k, et nous pouvons le prouver par induction. Notre scénario de base, lorsque k = 0, le premier terme est 0, et la valeur de k 2k est également 0. Pour l'étape inductive, supposons que la revendication est pour certains k et envisager k + 1. Ensuite, la valeur est de 2(k 2k) + 2k + 1 = k 2 k + 1 + 2k + 1 = (k + 1)2k + 1, de sorte que la revendication est pour k + 1, de l'achèvement de l'induction. Ainsi, la valeur de C'(k) est k 2k. Puisque n = 2 k, cela signifie que, en supposant que n est une puissance parfaite de deux, avons-nous que le nombre de comparaisons est
Impressionnant, c'est mieux que quicksort! Alors pourquoi sur la terre est quicksort plus rapide que la fusion de tri? Cela a à voir avec d'autres facteurs qui n'ont rien à voir avec le nombre de comparaisons. Principalement, depuis quicksort fonctionne à la place tandis que la fusion tri fonctionne hors de l'endroit, la localité de référence n'est pas aussi bonne dans la fusion de sorte que c'est dans quicksort. C'est un facteur énorme que quicksort est beaucoup, beaucoup mieux que la fusion de tri dans la pratique, étant donné que le coût d'un cache miss est assez énorme. En outre, le temps nécessaire pour trier un tableau n'est pas seulement le nombre de comparaisons en compte. D'autres facteurs, comme le nombre de fois que chaque élément du tableau est déplacé peut également être important. Par exemple, dans la fusion de tri nous avons besoin d'allouer de l'espace pour la mémoire tampon éléments, déplacer les éléments de sorte qu'ils peuvent être fusionnées, puis de fusionner de nouveau dans le tableau. Ces mouvements ne sont pas prises en compte dans notre analyse, mais ils ont certainement ajouter. Comparez cela à quicksort de l'étape de partitionnement, qui se déplace à chaque élément du tableau exactement une fois et reste à l'intérieur du tableau original. Ces facteurs supplémentaires, pas le nombre de comparaisons, de dominer l'algorithme du moteur d'exécution.
Cette analyse est un peu moins précis que le choix optimal, mais Wikipédia confirme que l'analyse est à peu près n lg n et que c'est en effet de moins en moins de comparaisons que quicksort la moyenne des cas.
Espérons que cette aide!
Dans le pire des cas, et en supposant qu'une simple mise en œuvre, le nombre de comparaisons pour trier n éléments est
n ⌈lg n⌉ − 2⌈lg n⌉ + 1
où lg n indique le logarithme en base 2 de n.
Ce résultat peut être trouvé dans l'article Wikipédia correspondant ou les récentes éditions du The Art of Computer Programming par Donald Knuth, et j'ai simplement écrit une preuve de cette réponse.
La fusion de deux tableaux triés (ou des listes), de la taille
k
resp.m
prendk+m-1
comparaisons au plus,min{k,m}
au mieux. (Après chaque comparaison, nous pouvons écrire une valeur de la cible, lorsque l'un des deux est épuisé, pas plus que les comparaisons sont nécessaires.)Laisser
C(n)
être le pire des cas certain nombre de comparaisons pour un mergesort d'un tableau (une liste) den
éléments.Puis nous avons
C(1) = 0
,C(2) = 1
, assez évidemment. De plus, nous avons la récurrenceUne simple induction montre
D'autre part, il est facile de voir que nous pouvons arbitrairement proche de la limite (pour chaque
ε > 0
, on peut construire des cas, avoir besoin de plus de(1-ε)*n*log_2 n
comparaisons), de sorte que la constante de mergesort est 1.De fusion de tri en O(n log n) et à chaque étape, dans le "pire" des cas (pour le nombre de comparaisons), effectue une comparaison.
Quicksort, d'autre part, est O(n^2) dans le pire des cas.