web-dev-qa-db-fra.com

Tri par insertion avec recherche binaire

Lors de la mise en œuvre du tri par insertion, une recherche binaire pourrait être utilisée pour localiser la position dans les premiers i-1 éléments du tableau dans lequel l'élément i devrait être inséré.

Comment cela affecterait-il le nombre de comparaisons requises? Comment une telle recherche binaire affecterait-elle le temps d'exécution asymptotique du tri par insertion?

Je suis à peu près sûr que cela réduirait le nombre de comparaisons, mais je ne sais pas trop pourquoi.

13
Derrek Whistle

Directement de Wikipedia:

Si le coût des comparaisons dépasse le coût des swaps, comme c'est le cas par exemple avec des clés de chaîne stockées par référence ou avec un humain interaction (comme choisir une paire affichée côte à côte), puis utiliser le tri par insertion binaire peut donner de meilleures performances. Binary Insertion} _ sort utilise une recherche binaire pour déterminer le correct emplacement pour insérer de nouveaux éléments et effectue donc ⌈log2 (n) ⌉ comparaisons dans le pire des cas, qui est O (n log n)}. L'algorithme en tant que Tout a toujours une durée d'exécution de O(n2) en moyenne à cause du série de swaps requis pour chaque insertion.

La source:

http://en.wikipedia.org/wiki/Insertion_sort#Variants

Voici un exemple:

http://jeffreystedfast.blogspot.com/2007/02/binary-insertion-sort.html

Je suis à peu près sûr que cela réduirait le nombre de comparaisons, mais je suis Je ne sais pas trop pourquoi.}

Eh bien, si vous connaissez déjà le tri par insertion et la recherche binaire, c'est plutôt simple. Lorsque vous insérez une pièce dans le tri par insertion, vous devez comparer toutes les pièces précédentes. Supposons que vous souhaitiez déplacer ce [2] au bon endroit. Vous devez comparer 7 pièces avant de trouver le bon endroit. 

[1] [3] [3] [3] [4] [4] [5] -> [2] <- [11] [0] [50] [47]

Cependant, si vous commencez la comparaison à mi-chemin (comme une recherche binaire), vous ne comparerez alors que 4 pièces! Vous pouvez le faire car vous savez que les pièces de gauche sont déjà en ordre (vous ne pouvez effectuer une recherche binaire que si les pièces sont en ordre!). 

Maintenant, imaginez que si vous aviez des milliers de pièces (voire des millions), cela vous ferait gagner beaucoup de temps. J'espère que ça aide. | = ^)

Si vous avez une bonne structure de données pour une recherche binaire efficace, il est peu probable qu’elle ait un temps d’insertion O (log n). Inversement, une bonne structure de données pour une insertion rapide à une position arbitraire est peu susceptible de prendre en charge la recherche binaire.

Pour obtenir les performances O (n log n) des meilleures comparaisons, les recherches avec tri par insertion nécessitent à la fois une recherche binaire O (log n) et une insertion arbitraire O (log n).

6
Patricia Shanahan

En supposant que le tableau soit trié (pour que la recherche binaire soit exécutée), cela ne réduira pas les comparaisons puisque la boucle interne se termine immédiatement après une comparaison (car l'élément précédent est plus petit). En général, le nombre de comparaisons dans le tri par insertion correspond au maximum au nombre d'inversions plus la taille du tableau - 1. 

Le nombre d'inversions dans le tableau trié étant égal à 0, le nombre maximal de comparaisons dans le tableau déjà trié est égal à N - 1.

1
WastedPandoo