INF1101 Cours11 Monceaux INF1101 – Algorithmes et structures de données

Preview:

Citation preview

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

Recommended