Leçon
La théorie — Tas binaire : une file de priorité dans un tableau
Un tas binaire min est un tableau où la clé à chaque position i est inférieure ou égale aux clés situées aux positions 2i + 1 et 2i + 2, ses enfants. Le parent de la position i se trouve à la position ⌊(i − 1) / 2⌋. Ainsi lu, le tableau représente un arbre binaire complet. La plus petite clé est toujours à la position 0, la racine. Pour insérer une clé, placez-la à la fin du tableau et faites-la remonter : échangez-la avec son parent tant qu’elle lui est inférieure. Pour extraire la plus petite clé, déplacez la dernière clé à la racine et faites-la descendre : échangez-la avec son plus petit enfant tant que celui-ci lui est inférieur. Un tas utilisé de cette façon constitue une file de priorité.
Ce que signifie chaque symbole
n- le nombre de clés dans le tas
i- une position dans le tableau, numérotée à partir de 0
h- la hauteur d’une position : le nombre de niveaux situés en dessous, ⌊log₂(n / (i + 1))⌋
- Suppose
- Une comparaison confronte deux clés ; un échange permute les clés de deux positions. Déplacer la dernière clé à la racine lors d’une extraction ne compte ni comme une comparaison ni comme un échange. Une clé égale à son parent ou à son plus petit enfant reste en place. Si les deux enfants sont égaux, on choisit celui de gauche. Le tas garde la plus petite clé à la racine ; pour un tas max, il suffit d’inverser toutes les comparaisons. L’outil accepte jusqu’à quinze clés de 0 à 99, afin que l’arbre entier tienne sur l’écran d’un téléphone. Les permutations comptées dans la dernière ligne portent sur des clés distinctes.
Problème entièrement résolu
-
Combien de comparaisons faut-il pour chaque construction avec un millier de clés ? 4 étapes
Cliquez sur Décroissant, un à un, puis sur Décroissant, par le bas, et expliquez les totaux de 34 et 22. Prenez ensuite 1 023 clés présentées par ordre décroissant. Combien de comparaisons chaque méthode effectue-t-elle ?
Ouvrez ce problème dans l'outil
-
La position i se trouve à la profondeur ⌊log₂(i + 1)⌋ : 1 position à la profondeur 0, 2 à la profondeur 1, 4 à la profondeur 2 et 8 à la profondeur 3. Dans l’ordre décroissant, chaque nouvelle clé est la plus petite reçue jusque-là. Elle remonte jusqu’à la racine, avec 1 comparaison et 1 échange par niveau : 0 + 2 · 1 + 4 · 2 + 8 · 3 = 34.
-
En partant du dernier parent, c’est la hauteur qui compte : 3 pour la racine, 2 pour les positions 1 et 2, 1 pour les 4 positions à la profondeur 2, 0 pour les 8 feuilles, soit 11 au total. Dans l’ordre décroissant, chaque clé descend jusqu’à une feuille. Avec 15 clés, chaque parent a deux enfants ; chaque niveau demande donc 2 comparaisons. On obtient 22 comparaisons et 11 échanges.
-
Avec 1 023 = 2¹⁰ − 1 clés, tous les niveaux de l’arbre sont remplis : il y en a 10, avec 2ᵈ positions à la profondeur d. Le coût des insertions successives est la somme des profondeurs : 1 · 2 + 2 · 4 + 3 · 8 + ⋯ + 9 · 512 = 8 194 comparaisons, et autant d’échanges.
-
La construction depuis le dernier parent coûte le double de la somme des hauteurs. Il y a 2⁹ positions de hauteur 0, 2⁸ de hauteur 1, et ainsi de suite jusqu’à la racine, de hauteur 9 : 1 · 256 + 2 · 128 + ⋯ + 9 · 1 = 1 013. C’est aussi 1 023 moins les 10 chiffres 1 de son écriture binaire. Le double donne 2 026 comparaisons, pour 1 013 échanges.
Réponse
8 194 comparaisons par insertions successives, 2 026 depuis le dernier parent, soit environ 8 par clé contre 2. La plupart des positions d’un tas ont une grande profondeur et une faible hauteur. L’insertion coûte selon la profondeur ; la construction depuis le dernier parent, selon la hauteur. L’outil s’arrête à 15 clés : le même calcul donne alors les totaux de 34 et 22 qu’il affiche.
-
Parcours
Ce qu’une structure de données rend peu coûteux
Références (2)
- Heapsort as first published: J. W. J. Williams, "Algorithm 232: Heapsort," Communications of the ACM 7(6), 347–348, June 1964.
- The heap-based sort published six months later, close to the version used today: Robert W. Floyd, "Algorithm 245: Treesort 3," Communications of the ACM 7(12), 701, December 1964.