INF1101 Cours11 Monceaux INF1101 – Algorithmes et structures de données.
-
Upload
foulques-levasseur -
Category
Documents
-
view
111 -
download
0
Transcript of INF1101 Cours11 Monceaux INF1101 – Algorithmes et structures de données.
INF1101
Cours11Cours11MonceauxMonceaux
INF1101 – Algorithmes et structures de INF1101 – Algorithmes et structures de donnéesdonné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
13
21
24 31
16
65
19
26 32
68
0 1 2 3 4 5 6 7 8 9 10 11
13 21 16 24 31 19 68 65 26 32
INF1101
Monceau – insertion de 14
13
21
24 31
16
65
19
26 32
68
14 ?
0 1 2 3 4 5 6 7 8 9 10 11
13 21 16 24 31 19 68 65 26 32
INF1101
Monceau - insertion de 14
13
21
24 31
16
65
19
26 32
68
0 1 2 3 4 5 6 7 8 9 10 11
13 21 16 24 31 19 68 65 26 32
14 ?
INF1101
Monceau - insertion de 14
13
21
24
31
16
65
19
26 32
68
0 1 2 3 4 5 6 7 8 9 10 11
13 21 16 24 19 68 65 26 32 31
14 ?
INF1101
Monceau - insertion de 14
13
2124
31
16
65
19
26 32
68
0 1 2 3 4 5 6 7 8 9 10 11
13 16 24 21 19 68 65 26 32 31
14 ?
INF1101
Monceau - insertion de 14
13
2124
31
16
65
19
26 32
68
14
0 1 2 3 4 5 6 7 8 9 10 11
13 14 16 24 21 19 68 65 26 32 31
INF1101
Monceau - retrait
13
2124
31
16
65
19
26 32
68
14
0 1 2 3 4 5 6 7 8 9 10 11
13 14 16 24 21 19 68 65 26 32 31
INF1101
Monceau - retrait
2124
31
16
65
19
26 32
68
14
0 1 2 3 4 5 6 7 8 9 10 11
14 16 24 21 19 68 65 26 32 31
INF1101
Monceau - retrait
2124
16
65
19
26 32
68
14
0 1 2 3 4 5 6 7 8 9 10 11
14 16 24 21 19 68 65 26 32
31 ?
INF1101
Monceau - retrait
2124
16
65
19
26 32
68
14
0 1 2 3 4 5 6 7 8 9 10 11
14 16 24 21 19 68 65 26 32
31 ?
INF1101
Monceau - retrait
21
24
16
65
19
26 32
68
14
0 1 2 3 4 5 6 7 8 9 10 11
14 21 16 24 19 68 65 26 32
31 ?
INF1101
Monceau - retrait
21
24
16
65
19
26 32
68
14
31
0 1 2 3 4 5 6 7 8 9 10 11
14 21 16 24 31 19 68 65 26 32
INF1101
Monceau - construction
47
20
21
61
45
17 55
63
92
12
37 25 64 83 73
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
92 47 21 20 12 45 63 61 17 55 37 25 64 83 73
INF1101
Monceau - construction
47
20
21
61
45
17 55
63
92
12
37 25 64 83 73
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
92 47 21 20 12 45 63 61 17 55 37 25 64 83 73
INF1101
Monceau - construction
47
20
21
61
45
17 55
63
92
12
37 25 64 83 73
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
92 47 21 20 12 45 63 61 17 55 37 25 64 83 73
INF1101
Monceau - construction
47
20
21
61
25
17 55
63
92
12
37 45 64 83 73
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
92 47 21 20 12 25 63 61 17 55 37 45 64 83 73
INF1101
Monceau - construction
47
20
21
61
25
17 55
63
92
12
37 45 64 83 73
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
92 47 21 20 12 25 63 61 17 55 37 45 64 83 73
INF1101
Monceau - construction
47
20
21
61
25
17 55
63
92
12
37 45 64 83 73
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
92 47 21 20 12 25 63 61 17 55 37 45 64 83 73
INF1101
Monceau - construction
47
17
21
61
25
20 55
63
92
12
37 45 64 83 73
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
92 47 21 17 12 25 63 61 20 55 37 45 64 83 73
INF1101
Monceau - construction
47
17
21
61
25
20 55
63
92
12
37 45 64 83 73
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
92 47 21 17 12 25 63 61 20 55 37 45 64 83 73
INF1101
Monceau - construction
47
17
21
61
25
20 55
63
92
12
37 45 64 83 73
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
92 47 21 17 12 25 63 61 20 55 37 45 64 83 73
INF1101
Monceau - construction
12
17
21
61
25
20 55
63
92
47
37 45 64 83 73
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
92 12 21 17 47 25 63 61 20 55 37 45 64 83 73
INF1101
Monceau - construction
12
17
21
61
25
20 55
63
92
37
47 45 64 83 73
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
92 12 21 17 37 25 63 61 20 55 47 45 64 83 73
INF1101
Monceau - construction
12
17
21
61
25
20 55
63
92
37
47 45 64 83 73
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
92 12 21 17 37 25 63 61 20 55 47 45 64 83 73
INF1101
Monceau - construction
92
17
21
61
25
20 55
63
12
37
47 45 64 83 73
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
12 92 21 17 37 25 63 61 20 55 47 45 64 83 73
INF1101
Monceau - construction
17
92
21
61
25
20 55
63
12
37
47 45 64 83 73
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
12 17 21 92 37 25 63 61 20 55 47 45 64 83 73
INF1101
Monceau - construction
17
20
21
61
25
92 55
63
12
37
47 45 64 83 73
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
12 17 21 20 37 25 63 61 92 55 47 45 64 83 73
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émentpush_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
37
20
2
65 36
12
57
0 1 2 3 4 5 6 7
12 37 2 20 57 65 36
MONCEAU
INF1101
Tri par monceau - Exemple
37
20
2
65 36
12
57
0 1 2 3 4 5 6 7
12 37 2 20 57 65 36
Création du monceau
MONCEAU
INF1101
Tri par monceau - Exemple
37
20
65
2 36
12
57
0 1 2 3 4 5 6 7
12 37 65 20 57 2 36
Création du monceau
MONCEAU
INF1101
Tri par monceau - Exemple
57
20
65
2 36
12
37
0 1 2 3 4 5 6 7
12 57 65 20 37 2 36
Création du monceau
MONCEAU
INF1101
Tri par monceau - Exemple
57
20
12
2 36
65
37
0 1 2 3 4 5 6 7
65 57 12 20 37 2 36
Création du monceau
MONCEAU
INF1101
Tri par monceau - Exemple
57
20
36
2 12
65
37
0 1 2 3 4 5 6 7
65 57 36 20 37 2 12
Création du monceau (fin)
MONCEAU
INF1101
Tri par monceau - Exemple
57
20
36
2
12
37
0 1 2 3 4 5 6 7
12 57 36 20 37 2 65
Retrait du premier élément
MONCEAU
INF1101
Tri par monceau - Exemple
12
20
36
2
57
37
0 1 2 3 4 5 6 7
57 12 36 20 37 2 65
Percoler
MONCEAU
INF1101
Tri par monceau - Exemple
37
20
36
2
57
12
0 1 2 3 4 5 6 7
57 37 36 20 12 2 65
Percoler
MONCEAU
INF1101
Tri par monceau - Exemple
37
20
36
2
12
0 1 2 3 4 5 6 7
2 37 36 20 12 57 65
Retrait du premier élément
MONCEAU
INF1101
Tri par monceau - Exemple
2
20
36
37
12
0 1 2 3 4 5 6 7
37 2 36 20 12 57 65
Percoler
MONCEAU
INF1101
Tri par monceau - Exemple
20
2
36
37
12
0 1 2 3 4 5 6 7
37 20 36 2 12 57 65
Percoler
MONCEAU
INF1101
Tri par monceau - Exemple
20
2
36
12
0 1 2 3 4 5 6 7
12 20 36 2 37 57 65
Retrait du premier élément
MONCEAU
INF1101
Tri par monceau - Exemple
20
2
12
36
0 1 2 3 4 5 6 7
36 20 12 2 37 57 65
Percoler
MONCEAU
INF1101
Tri par monceau - Exemple
20 12
2
0 1 2 3 4 5 6 7
2 20 12 36 37 57 65
Retrait du premier élément
MONCEAU
INF1101
Tri par monceau - Exemple
2 12
20
0 1 2 3 4 5 6 7
20 2 12 36 37 57 65
Percoler
MONCEAU
INF1101
Tri par monceau - Exemple
2
12
0 1 2 3 4 5 6 7
12 2 20 36 37 57 65
Retrait du premier élément
MONCEAU
INF1101
Tri par monceau - Exemple
2
12
0 1 2 3 4 5 6 7
12 2 20 36 37 57 65
Percoler
MONCEAU
INF1101
Tri par monceau - Exemple
2
0 1 2 3 4 5 6 7
2 12 20 36 37 57 65
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
37
20
2
65 36
12
57
0 1 2 3 4 5 6 7
12 37 2 20 57 65 36
MONCEAU
INF1101
Tri partiel - exemple
20
37
12
65 36
2
57
0 1 2 3 4 5 6 7
2 20 12 37 57 65 36
MONCEAU
Création du monceau
INF1101
Tri partiel - exemple
20
37
12
65
36
57
0 1 2 3 4 5 6 7
36 20 12 37 57 65 2
MONCEAU
Retrait du premier élément
INF1101
Tri partiel - exemple
20
37
36
65
12
57
0 1 2 3 4 5 6 7
12 20 36 37 57 65 2
MONCEAU
Percoler
INF1101
Tri partiel - exemple
20
37
36
65
57
0 1 2 3 4 5 6 7
65 20 36 37 57 12 2
MONCEAU
Retrait du premier élément
INF1101
Tri partiel - exemple
37
65
36
20
57
0 1 2 3 4 5 6 7
20 37 36 65 57 12 2
MONCEAU
Percoler
INF1101
Tri partiel - exemple
37
65
36
57
0 1 2 3 4 5 6 7
57 37 36 65 20 12 2
MONCEAU
Retrait du premier élément
INF1101
Tri partiel - exemple
37
65
57
36
0 1 2 3 4 5 6 7
36 37 57 65 20 12 2
MONCEAU
Percoler
INF1101
Tri partiel - exemple
0 1 2 3 4 5 6 7
36 37 57 65 20 12 2
MONCEAU
Si on arrête ici, on voit qu’on a bien obtenu les 3plus petits éléments, qui sont en ordre croissant sion 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