INF1101 Cours11 Monceaux INF1101 – Algorithmes et structures de données
INF1101 Plan Définition de monceau Implémentation Insertion et retrait d’éléments Construction d’un monceux Monceaux dans la STL Tri par monceau
INF1101 Monceau - définition Un arbre complet tel que pour chaque noeud N dont le parent est P, la clé de P est plus petite que celle de N Normalement implémenté dans un tableau Insertion et retrait sont O(lg N) dans le pire cas Insertion est O(1) en moyenne Recherche du plus petit élément est O(1) dans le pire cas
INF1101 Monceau – implémentation On utilise un tableau pour implémenter l’arbre On met la racine de l’arbre à la position 1, plutôt que la position 0, ce qui facilite les opérations
INF1101 Monceau - exemple
INF1101 Monceau – insertion de ?
INF1101 Monceau - insertion de ?
INF1101 Monceau - insertion de ?
INF1101 Monceau - insertion de ?
INF1101 Monceau - insertion de
INF1101 Monceau - retrait
INF1101 Monceau - retrait
INF1101 Monceau - retrait ?
INF1101 Monceau - retrait ?
INF1101 Monceau - retrait ?
INF1101 Monceau - retrait
INF1101 Monceau - construction
INF1101 Monceau - construction
INF1101 Monceau - construction
INF1101 Monceau - construction
INF1101 Monceau - construction
INF1101 Monceau - construction
INF1101 Monceau - construction
INF1101 Monceau - construction
INF1101 Monceau - construction
INF1101 Monceau - construction
INF1101 Monceau - construction
INF1101 Monceau - construction
INF1101 Monceau - construction
INF1101 Monceau - construction
INF1101 Monceau - construction
INF1101 Monceaux dans la STL Fonction pour créer un monceau: make_heap(Iterator deb, Iterator fin) Fonctions pour insérer et retirer un élément push_heap(Iterator deb, Iterator fin) pop_heap(Iterator deb, Iterator fin) Toutes ces fonctions ont une seconde version avec un troisième argument qui est un prédicat qui permet de redéfinir l’opérateur de comparaison utilisé Note: l’itérateur doit être un itérateur à accès direct, ce qui limite les possibilités de conteneurs (vector et deque)
INF1101 Monceaux dans la STL Il existe aussi un adaptateur priority_queue On peut choisir le type de conteneur et de fonction de comparaison Offre les fonctions suivantes: –push() –top() –pop() Voir les exemples fournis en annexe (à exécuter dans.NET)
INF1101 Tri par monceau - Principe On applique les modifications suivantes au monceau: –chaque noeud a une valeur plus grande ou égale à celle de tous ses descendants –dans le tableau qui implémente le monceau, la racine se trouve à l’index 0 (au lieu de 1) –pour chaque noeud i, les index sont donc 2*i+1 pour le fils gauche et 2*i+2 pour le fils droit
INF1101 Tri par monceau - Principe La procédure est la suivante: –On met dans le tableau les valeurs à trier –On crée le monceau initial (de type Parent > Fils) –On retire la racine du monceau (qui est la plus grande valeur) et on la permute avec le dernier item du monceau –On fait percoler la racine, s’il y a lieu –On répète le processus avec le monceau obtenu qui contient maintenant un élément de moins
INF1101 Tri par monceau - Exemple MONCEAU
INF1101 Tri par monceau - Exemple Création du monceau MONCEAU
INF1101 Tri par monceau - Exemple Création du monceau MONCEAU
INF1101 Tri par monceau - Exemple Création du monceau MONCEAU
INF1101 Tri par monceau - Exemple Création du monceau MONCEAU
INF1101 Tri par monceau - Exemple Création du monceau (fin) MONCEAU
INF1101 Tri par monceau - Exemple Retrait du premier élément MONCEAU
INF1101 Tri par monceau - Exemple Percoler MONCEAU
INF1101 Tri par monceau - Exemple Percoler MONCEAU
INF1101 Tri par monceau - Exemple Retrait du premier élément MONCEAU
INF1101 Tri par monceau - Exemple Percoler MONCEAU
INF1101 Tri par monceau - Exemple Percoler MONCEAU
INF1101 Tri par monceau - Exemple Retrait du premier élément MONCEAU
INF1101 Tri par monceau - Exemple Percoler MONCEAU
INF1101 Tri par monceau - Exemple Retrait du premier élément MONCEAU
INF1101 Tri par monceau - Exemple Percoler MONCEAU
INF1101 Tri par monceau - Exemple Retrait du premier élément MONCEAU
INF1101 Tri par monceau - Exemple Percoler MONCEAU
INF1101 Tri par monceau - Exemple Retrait du premier élément Le tableau est maintenant trié
INF1101 Tri partiel Supposons maintenant un monceau dont la racine est le plus petit élément (contrairement à l’exemple précédent) Supposons que le tableau contient n éléments, et une valeur m < n On remarquera que après m itérations, on obtient, à la fin du tableau, et en ordre inverse, les m plus petits éléments du tableau On peut donc, de manière efficace, trier les m plus petits éléments du tableau: O(m lg n) Avec le tri par sélection, c’est aussi possible, mais moins efficace: O(mn)
INF1101 Tri partiel - exemple MONCEAU
INF1101 Tri partiel - exemple MONCEAU Création du monceau
INF1101 Tri partiel - exemple MONCEAU Retrait du premier élément
INF1101 Tri partiel - exemple MONCEAU Percoler
INF1101 Tri partiel - exemple MONCEAU Retrait du premier élément
INF1101 Tri partiel - exemple MONCEAU Percoler
INF1101 Tri partiel - exemple MONCEAU Retrait du premier élément
INF1101 Tri partiel - exemple MONCEAU Percoler
INF1101 Tri partiel - exemple MONCEAU Si on arrête ici, on voit qu’on a bien obtenu les 3 plus petits éléments, qui sont en ordre croissant si on parcourt le tableau à partir de la fin
INF1101 Les tris dans la STL sort(): –Doit garantir un temps moyen dans O(n lg n) –Le tri rapide (quicksort) répond à ce critère stable_sort(): –Doit garantir O(n lg n) dans le pire cas –Peut utiliser de la mémoire supplémentaire –Le tri par fusion (mergesort) répond à ce critère partial_sort() –Doit garantir un temps moyen dans O(n lg n) –Doit permettre le tri partiel –Le tri par monceau (heapsort) répond à ce critère