Télécharger la présentation
La présentation est en train de télécharger. S'il vous plaît, attendez
Publié parÉlodie Larose Modifié depuis plus de 9 années
2
Structures de données IFT-2000 Abder Alikacem Semaine 10 Les algorithmes de recherche Les structures arborescentes Département d’informatique et de génie logiciel Édition septembre 2009
3
Les algorithmes de recherche Les algorithmes de recherche La recherche séquentielle La recherche dichotomique Complexité des algorithmes de recherche Recherche dichotomique et arborescence
4
La recherche séquentielle 314281412116910 recherche(3)=1 comparaison recherche(10)=11 comparaisons recherche(12)=7 comparaisons recherche(13)=11 comparaisons meilleur cas=O(1) pire cas=O(n) en moyenne= O(n/2) absences=O(n) Données pas triées
5
La recherche séquentielle 123468910111214 recherche(1)=1 comparaison recherche(14)=11 comparaisons recherche(8)=6 comparaisons recherche(13)=11 comparaisons meilleur cas=O(1) pire cas=O(n) en moyenne= O(n/2) absences=O(n/2) Données triées
6
La recherche séquentielle données non triées : données présentes : O(n/2) données absentes : O(n) données triées : données présentes : O(n/2) données absentes : O(n/2) coût pour trier et maintenir triées !
7
Modèles d’implantation tableau : liste chaînée : 123468910111214 123468910111214
8
La recherche binaire implantation en tableau = accès direct à n’importe quel élément en regardant tout de suite au milieu, on peut éliminer la moitié des données 123468910111214
9
La recherche binaire 123468910111214 100
10
La recherche binaire 123468910111214 1005
11
La recherche binaire 123468910111214 1005
12
La recherche binaire 123468910111214 1005
13
La recherche binaire : 10 ? 123468910111214 1005
14
La recherche binaire : 10 ? 123468910111214 1005
15
La recherche binaire : 10 ? 123468910111214 123468910111214 1005 6
16
La recherche binaire : 10 ? 123468910111214 123468910111214 1005 6 8
17
La recherche binaire : 10 ? 123468910111214 123468910111214 1005 6 8
18
La recherche binaire : 10 ? 123468910111214 123468910111214 1005 6 8
19
La recherche binaire : 10 ? 123468910111214 123468910111214 123468910111214 1005 6 8 67
20
La recherche binaire : 10 ? 123468910111214 123468910111214 123468910111214 1005 6 8 67
21
La recherche binaire : 10 ? 123468910111214 123468910111214 123468910111214 1005 6 8 67
22
La recherche binaire : 10 ? 123468910111214 123468910111214 123468910111214 1005 6 8 67 1234689 111214 7
23
La recherche binaire : 10 ? 123468910111214 123468910111214 123468910111214 1005 6 8 67 1234689 111214 7
24
La recherche binaire : 9.5 ? 123468910111214 123468910111214 123468910111214 1005 6 8 67 1234689 111214 7
25
La recherche binaire : 9.5 ? 123468910111214 123468910111214 123468910111214 1005 6 8 67 1234689 111214 7 11 5 2 1
26
La recherche binaire : 9.5 ? 123468910111214 123468910111214 123468910111214 1005 6 8 67 1234689 111214 7 11 5 2 1 n n/2 n/4 n/8
27
Algorithme récursif Récursion x tab[debut..fin] si x = tab[milieu] (condition d’arrêt) si x < tab[milieu] et x tab[debut..milieu-1] si x > tab[milieu] et x tab[milieu+1..fin] Conditions d’arrêt x tab[debut..fin] si debut > fin x tab[debut..fin] si x = tab[milieu] Convergence 123468910111214 123468910111214 123468910111214 1005 6 8 67 1234689 111214 7
28
Template int rechercheBinRec(T * tab, const T& val, int debut, int fin) {int milieu; /*A: tab est correctement initialisé*/ if (debut > fin) return -1; else { milieu= (debut + fin)/2; if( val == tab[milieu]) return milieu; else { if( val < tab[milieu]) return(rechercheBinRec(tab,val,debut, milieu-1)); else return(rechercheBinRec(tab,val,milieu+1,fin)); } Algorithme récursif
29
Il vaut bien mieux implanter cet algorithme de manière itérative, car la fonction se rappelle jusqu'à trouver la position désirée, puis seulement on effectue les dépilages, alors que l'on n'a plus besoin des états intermédiaires qui ont été mémorisés par la récursivité puisque le problème est résolu. Remarque sur les algorithmes récursifs
30
Tableau comparatif recherche séquentielle : (données triées) données présentes : O(n/2) données absentes : O(n/2) recherche binaire : (données triées) données présentes : O(log n) données absentes : O(log n)
31
Modèles d’implantation tableau : liste chaînée ? 123468910111214 123468910111214 100
32
Structures pointées 123468910111214 012345678910
33
Structures pointées 123468910111214 012345678910
34
Structures pointées 123468910111214 012345678910
35
Structures pointées 12346 8 910111214 01234678910
36
Structures pointées 12346 8 910111214 01234678910
37
Structures pointées 12346 8 910111214 01234678910
38
Structures pointées 12 3 46 8 910 11 1214 013467910
39
Structures pointées 12 3 46 8 910 11 1214 013467910
40
Structures pointées 12 3 46 8 910 11 1214 013467910
41
Structures pointées 1 2 3 4 6 8 9 10 11 12 14
42
Structures pointées 1 2 3 4 6 8 9 10 11 12 14
43
Structures pointées 1 2 3 4 6 8 9 10 11 12 14
44
Structures pointées 1 2 3 4 6 8 9 10 11 12 14
45
Arbre binaire ! 1 2 3 4 6 8 9 10 11 12 14
46
Arbre = index 1 2 3 4 6 8 9 10 11 12 14
47
Les structures d’arbres Définitions Parcours d’arbres Arbres binaires complets ou feuillus Description en terme de type abstrait et implantation Dans un tableau Par chaînage dynamique
48
Définitions Un arbre orienté (appelé parfois arbre enraciné) est un graphe acyclique orienté qui vérifie les conditions suivantes: Il existe exactement un noeud qui n'a pas de ‘ prédécesseur ’. Ce noeud s'appelle la racine et l'ordre d'entrée de la racine est 0. Tous les noeuds, sauf la racine, n'ont qu'un ‘ prédécesseur ’ et ils ont tous un ordre d'entrée égal à 1. Il existe un chemin unique de la racine à chaque noeud. A M B V R O N P Q S T
49
Terminologie des arbres Parent d’un nœud(Père) Parent d’un nœud (Père) : Le nœud immédiatement prédécesseur. Enfant(s) d’un nœud (fils) Enfant(s) d’un nœud (fils) : Le ou les nœuds immédiatement successeurs du nœud. Racine Racine : Un nœud qui n’a pas de prédécesseur. Feuille Feuille : Un nœud qui n’a pas d’enfants. Ancêtre(s) d’un nœud Ancêtre(s) d’un nœud : Tous les nœuds prédécesseurs jusqu’à la racine. Descendant(s) d’un nœud Descendant(s) d’un nœud : Tous les nœuds successeurs jusqu’aux feuilles accessibles par ce nœud. Hauteur d’un nœud Hauteur d’un nœud : Le chemin le plus long pour atteindre une feuille. Niveau ou profondeur d’un nœud Niveau ou profondeur d’un nœud : L’ordre du chemin à partir de la racine. Forêt Forêt : Un ensemble d’arbres. A M B V R O N P Q S T
50
Terminologie des arbres Un arbre est soit vide ou possède une racine à laquelle est rattaché zéro ou plusieurs sous-arbres non vides. T1T1 T2T2 Racine Racine de T 1 Racine de T 2 ==> structures récursives
51
Terminologie des arbres Le nombre de sous-arbres associés à un noeud (nombre de descendants directs) est appelé le degré du noeud. Le degré d'un arbre correspond au degré le plus élevé de ses noeuds. Une chaîne (liste linéaire) est un arbre de degré 1. b an ir e z Le sous-arbre de racine i est l’arbre composé des descendants de i, enraciné en i On appelle aussi ce sous-arbre : fils de b
52
tableau liste chaînée 123468910111214 Une liste est un arbre de degré 1 123468910111214 100
53
Arbre binaire racine sous-arbre de gauchesous-arbre de droite nœuds internes feuilles Un arbre de degré 2 est appelé arbre binaire.
54
Arbres n-aire racine nœuds internes feuilles... Un arbre de degré n est appelé arbre n-aire.
55
Les arbres ordonnés Un arbre ordonné est un arbre où la position respective des sous-arbres reflète une relation d'ordre. Exemple: l’arbre de Huffman pour la compression de données
56
Les arbres ordonnés Les opérandes sont placées dans les nœuds feuilles, les opérateurs binaires dans les autres nœuds. L’évaluation d’un arbre arithmétique se fait en appliquant l’opérateur à sa racine au résultat des sous-arbres de gauche et de droite. Exemple : arbre arithmétique
57
Arbres partiellement ordonnés: le monceau 94 67 5544 42 18 12 06 La valeur de la clé d’un parent est plus grande (ou égale) à celle de ses 2 fils L’arbre est complet: tous les nœuds sont présents sauf éventuellement dans le dernier niveau. Si c’est le cas, le remplissage des nœuds dans ce niveau doit se faire de gauche à droite.
58
Les arbres de tri Un arbre binaire de tri ordonne totalement les informations qu’il stocke(par clé) : Toutes les clés de valeur inférieure ou égale à celle de la racine sont stockées dans le descendant gauche de la racine. Toutes les clés de valeur strictement supérieure à celle de la racine sont stockées dans le descendant droit de la racine. Tout ajout, toute suppression de nœud doit maintenir cette propriété vraie. 49 34 3020 23 5O 45 gauche 48 droit 29 24 Ajout de la valeur 49 : Remarque : Tout ajout se fait par une feuille. Ajoute de la valeur 24 49 24
59
Les arbres de recherche Un arbre de tri est également dit de recherche à condition d’être équilibré. Un arbre équilibré est un arbre organisé de telle manière à ce que sa profondeur soit minimale. La recherche d'un élément dans un arbre est alors logarithmique. Critères HB[k] (height-balanced(k) tree) HB[1] HB[2] Les arbres équilibrés sont dits arbres AVL (du nom de leurs inventeurs Adel'son -Vel'skii Landis en 1962). Un arbre binaire est dit équilibré lorsque la différence entre les hauteurs des fils gauche et droit de tout noeud ne peut excéder 1 en valeur absolue (si HB[1] ):|hauteur (sous-arbre droit) - hauteur (sous-arbre gauche)| 1) Cette différence de hauteur est appelée facteur d’équilibre.
60
Arbres AVL - exemples 128410162146 Un arbre AVL 128410162146 1 Après l’ajout de 1, ce n’est plus un arbre AVL Ces noeuds violent la condition
61
Arbres de recherche et algorithmique Les arbres binaires de recherche présentent deux avantages : tri efficace car les valeurs sont maintenues ordonnées recherche efficace par dichotomie, beaucoup plus efficace que la recherche linéaire dans une liste. template class Arbre {... bool rechercher (const X& E); // est retourné : vrai si E est dans l’arbre, faux sinon... }
62
Arbres de recherche et algorithmique bool rechercher (const X& E); // est retourné : vrai si E est dans l’arbre, faux sinon si vide => retourner faux sinon si (E = valeur racine) => retourner vrai sinon si (E<valeur racine) => retourner rechercher dans sous-arbre gauche sinon retourner rechercher dans sous-arbre droit fsi fsi fsi Si n est le nombre de nœuds et si l ’arbre est équilibré alors la complexité de l ’algorithme de recherche dichotomique est de l ’ordre de log 2 (n). Exemple : n=1024 => complexité ~ 10
63
Visite arborescente priorité au père (pré-ordre) 1. visiter la racine r ; 2. visiter récursivement les enfants : v 1, v 2, …, v k A M R O N P Q T Ø B Dans le parcours préordre, les descendants d’un nœud sont traités après lui:
64
Visite arborescente priorité au père (pré-ordre) 1. visiter la racine r ; 2. visiter récursivement les enfants : v 1, v 2, …, v k A M R O N P Q T R B 23 1
65
Visite arborescente priorité au père (pré-ordre) 1. visiter la racine r ; 2. visiter récursivement les enfants : v 1, v 2, …, v k A M R O N P Q T R B 23 1
66
Visite arborescente priorité au père (pré-ordre) 1. visiter la racine r ; 2. visiter récursivement les enfants : v 1, v 2, …, v k A M R O N P Q T R,M B 2 3 1
67
Visite arborescente priorité au père (pré-ordre) 1. visiter la racine r ; 2. visiter récursivement les enfants : v 1, v 2, …, v k A M R O N P Q T R,M B 2 3 1
68
Visite arborescente priorité au père (pré-ordre) 1. visiter la racine r ; 2. visiter récursivement les enfants : v 1, v 2, …, v k A M R O N P Q T R,M,A B 23 1
69
Visite arborescente priorité au père (pré-ordre) 1. visiter la racine r ; 2. visiter récursivement les enfants : v 1, v 2, …, v k A M R O N P Q T R,M,A B 23 1
70
Visite arborescente priorité au père (pré-ordre) 1. visiter la racine r ; 2. visiter récursivement les enfants : v 1, v 2, …, v k A M R O N P Q T R,M,A,T B 23 1
71
Visite arborescente priorité au père (pré-ordre) 1. visiter la racine r ; 2. visiter récursivement les enfants : v 1, v 2, …, v k A M R O N P Q T R,M,A,T B
72
Visite arborescente priorité au père (pré-ordre) 1. visiter la racine r ; 2. visiter récursivement les enfants : v 1, v 2, …, v k A M R O N P Q T R,M,A,T B 2 3 1
73
Visite arborescente priorité au père (pré-ordre) 1. visiter la racine r ; 2. visiter récursivement les enfants : v 1, v 2, …, v k A M R O N P Q T R,M,A,T B 2 3 1
74
Visite arborescente priorité au père (pré-ordre) 1. visiter la racine r ; 2. visiter récursivement les enfants : v 1, v 2, …, v k A M R O N P Q T R,M,A,T,B B 23 1
75
Visite arborescente priorité au père (pré-ordre) 1. visiter la racine r ; 2. visiter récursivement les enfants : v 1, v 2, …, v k A M R O N P Q T R,M,A,T,B B 23 1
76
Visite arborescente priorité au père (pré-ordre) 1. visiter la racine r ; 2. visiter récursivement les enfants : v 1, v 2, …, v k A M R O N P Q T R,M,A,T,B,... B 23 1
77
Visite arborescente priorité au père (pré-ordre) 1. visiter la racine r ; 2. visiter récursivement les enfants : v 1, v 2, …, v k A M R O N P Q T R,M,A,T,B,N,O,P,Q B 23 1
78
Utilité d’un pré-ordre / * log + - 3 * n 1n 1 n ( (1/n) * (log(n+1)) ) - (3*n) - * / 1 n log + n 1 * 3 n Jan Lukasiewicz
79
Visite arborescente priorité aux fils (post-ordre) 1. visiter récursivement les enfants : v 1, v 2, …, v k 2. visiter la racine r ; A M R O N P Q T Ø B 12 3 Dans le parcours post-ordre, les descendants d’un nœud sont traités avant lui:
80
Visite arborescente priorité aux fils (post-ordre) 1. visiter récursivement les enfants : v 1, v 2, …, v k 2. visiter la racine r ; A M R O N P Q T Ø B 12 3
81
Visite arborescente priorité aux fils (post-ordre) 1. visiter récursivement les enfants : v 1, v 2, …, v k 2. visiter la racine r ; A M R O N P Q T Ø B 1 2 3
82
Visite arborescente priorité aux fils (post-ordre) 1. visiter récursivement les enfants : v 1, v 2, …, v k 2. visiter la racine r ; A M R O N P Q T Ø B 12 3
83
Visite arborescente priorité aux fils (post-ordre) 1. visiter récursivement les enfants : v 1, v 2, …, v k 2. visiter la racine r ; A M R O N P Q T T B 12 3
84
Visite arborescente priorité aux fils (post-ordre) 1. visiter récursivement les enfants : v 1, v 2, …, v k 2. visiter la racine r ; A M R O N P Q T T,A B 12 3
85
Visite arborescente priorité aux fils (post-ordre) 1. visiter récursivement les enfants : v 1, v 2, …, v k 2. visiter la racine r ; A M R O N P Q T T,A B 1 2 3
86
Visite arborescente priorité aux fils (post-ordre) 1. visiter récursivement les enfants : v 1, v 2, …, v k 2. visiter la racine r ; A M R O N P Q T T,A,B B 1 2 3
87
Visite arborescente priorité aux fils (post-ordre) 1. visiter récursivement les enfants : v 1, v 2, …, v k 2. visiter la racine r ; A M R O N P Q T T,A,B,M B 1 2 3
88
Visite arborescente priorité au fils (post-ordre) 1. visiter récursivement les enfants : v 1, v 2, …, v k 2. visiter la racine r ; A M R O N P Q T T,A,B,M B 12 3
89
Visite arborescente priorité aux fils (post-ordre) 1. visiter récursivement les enfants : v 1, v 2, …, v k 2. visiter la racine r ; A M R O N P Q T T,A,B,M,... B 12 3
90
Visite arborescente priorité aux fils (post-ordre) 1. visiter récursivement les enfants : v 1, v 2, …, v k 2. visiter la racine r ; A M R O N P Q T T,A,B,M,O,P,Q,N,R B 12 3
91
Utilité d’un post-ordre / * log + - 3 * n 1n 1 n ( (1/n) * (log(n+1)) ) - (3*n) 1 n / n 1 + log * 3 n * - Jan Lukasiewicz
92
Visite arborescente ordre symétrique (en-ordre) 1. visiter l’enfant de gauche (v 1 ) 2. visiter la racine r ; 3. visiter l’enfant de droite (v 2 ) A M R O N Q T B Dans le parcours en ordre, un descendant est traité avant le nœud, l’autre est traité après lui:
93
Visite arborescente ordre symétrique (en-ordre) 1. visiter l’enfant de gauche (v 1 ) 2. visiter la racine r ; 3. visiter l’enfant de droite (v 2 ) A M R O N Q T Ø B
94
Visite arborescente ordre symétrique (en-ordre) 1. visiter l’enfant de gauche (v 1 ) 2. visiter la racine r ; 3. visiter l’enfant de droite (v 2 ) A M R O N Q T A B
95
Visite arborescente ordre symétrique (en-ordre) 1. visiter l’enfant de gauche (v 1 ) 2. visiter la racine r ; 3. visiter l’enfant de droite (v 2 ) A M R O N Q T A,T B
96
Visite arborescente ordre symétrique (en-ordre) 1. visiter l’enfant de gauche (v 1 ) 2. visiter la racine r ; 3. visiter l’enfant de droite (v 2 ) A M R O N Q T A,T,M B
97
Visite arborescente ordre symétrique (en-ordre) 1. visiter l’enfant de gauche (v 1 ) 2. visiter la racine r ; 3. visiter l’enfant de droite (v 2 ) A M R O N Q T A,T,M,B B
98
Visite arborescente ordre symétrique (en-ordre) 1. visiter l’enfant de gauche (v 1 ) 2. visiter la racine r ; 3. visiter l’enfant de droite (v 2 ) A M R O N Q T A,T,M,B,R B
99
Visite arborescente ordre symétrique (en-ordre) 1. visiter l’enfant de gauche (v 1 ) 2. visiter la racine r ; 3. visiter l’enfant de droite (v 2 ) A M R O N Q T A,T,M,B,R,O B
100
Visite arborescente ordre symétrique (en-ordre) 1. visiter l’enfant de gauche (v 1 ) 2. visiter la racine r ; 3. visiter l’enfant de droite (v 2 ) A M R O N Q T A,T,M,B,R,O,N B
101
Visite arborescente ordre symétrique (en-ordre) 1. visiter l’enfant de gauche (v 1 ) 2. visiter la racine r ; 3. visiter l’enfant de droite (v 2 ) A M R O N Q T A,T,M,B,R,O,N,Q B
102
Utilité de l’ordre symétrique / * log + - 3 * n 1n 1 n ( (1/n) * (log(n+1)) ) - (3*n) (((1/n) * (log(n+1))) - (3*n)) 1 / n * log n + 1 - 3 * n
103
Utilité de l’ordre symétrique 1,2,3,4,6,8,9,10,11,12,14 1 2 3 4 6 8 9 10 11 12 14
104
Parcours par niveau L’algorithme utilise une file. Il s’agit d’un parcours par largeur (contagion) tel que discuté dans le cours. Dans le parcours par niveau, tous les nœuds d’un même niveau sont traités avant de descendre au niveau suivant. / * log + - 3 * n 1n 1 n - * * / log 3 n 1 n + n 1
105
1 1.11.2 1.1.11.1.21.2.11.2.2 Adressage hiérarchique opérations facilitées : comparaison rapide de nœuds, trouver le parent commun, positionne le nœud dans l’arbre Il s’agit d’adresser chaque nœud par une chaîne de caractères. La racine a comme adresse 1 , son fils gauche 1.1 , son fils droit 1.2 . Tout fils gauche a comme adresse l’adresse de son parent qu’on concatène 1, on concatène 2 pour les fils droits.
106
Dessiner l’arbre binaire dont le parcours symétrique et le parcours en pré-ordre sont les suivants : symétrique:A,B,D,E,L,P,S,O pré-ordre :O,S,P,L,E,D,B,A Exercice
107
Dessiner l’arbre binaire dont le parcours symétrique et le parcours en pré-ordre sont les suivants : symétrique:D,L,P,S,E,A,O,B pré-ordre :P,D,L,O,A,S,E,B
108
Opérateurs (arbres binaires) arbre vide ? nombre de nœuds d’un arbre nombre de feuilles d’un arbre élément de la racine d’un arbre sous-arbre de gauche d’un nœud sous-arbre de droite d’un nœud hauteur à partir d’un nœud appartenance d’un élément à un arbre ajout (insertion) dans un arbre enlèvement dans un arbre minimum des éléments d’un arbre (≤) maximum des éléments d’un arbre (≤) enfants d’un nœud descendants d’un nœud père (parent) d’un nœud ancêtres d’un nœud successeur d’un nœud (≤) prédécesseur d’un nœud (≤)
109
Implantation en tableau 1 2 3 4 6 8 9 10 11 12 14 123456789101112131415
110
Implantation en tableau 1 2 3 4 6 8 9 10 11 12 14 99 123456789101112131415
111
Implantation en tableau appariement : la racine est à l’indice 1 sous-arbre de gauche est à 2*i sous-arbre de droite est à 2*i + 1 parent de l’élément d’indice i est à i/2 frère de droite est à i+1 (si i pair et i+1 ≤ N) frère de gauche est à i-1 (si i impair et i ≠ 1) 123456789101112131415
112
Implantation en tableau 1 2 3 4 6 8 9 10 11 12 14 99 123456789101112131415
113
Implantation en tableau 1 2 3 4 6 8 9 10 11 12 14 1 23 4567 8 9 9101112131415 9 123456789101112131415
114
Implantation en tableau 1 2 3 4 6 8 9 10 11 12 14 831124101216914 1 23 4567 8 9 9101112131415 9 123456789101112131415
115
Implantation en tableau Avantages : simplicité d’implantation aucun espace perdu pour les pointeurs espace pour insérer un nœud déjà disponible parcours par niveau facilité parcours des feuilles facilité 831124101216914 123456789101112131415
116
Implantation en tableau Désavantages : espace perdu pour les trous trouvez des cas où il y aura plusieurs trous ! on doit prévoir le pire cas en espace, ou réallouer le tableau et le recopier besoin d’une sentinelle pour signifier l’absence de données (ou utilisation d’un booléen) trouvez le pire cas ! 831124101216914 123456789101112131415
117
Implantation en tableau Désavantages pire cas 8 11 12 14 123456789101112131415 8 11 12 14 1 3 7 15 Arbre dégénéré vers la droite
118
Arbre feuillu ou complet Arbre complet: Un arbre de degré n est dit complet lorsque tous ses niveaux, à l’exception du dernier, possède un nombre maximal de nœuds. Le dernier niveau, quant à lui, est partiellement rempli de gauche à droite, sans trou. Arbre de degré 3 complet Arbre binaire complet indice du premier élément du niveau k ? nombre de feuilles ? nombre de nœuds internes ? nombre de nœuds ? hauteur ? 9 9 1 2 3 4567 89111214151013
119
Arbre binaire feuillu ou complet indice du premier élément du niveau k ? nombre de feuilles maximum = (n + 1) / 2 nombre de nœuds maximum = 2 p – 1, p= nombre de niveaux hauteur = log((n + 1)/ 2). 123456789101112131415 9 9 1 2 3 4567 89111214151013
120
La classe Arbre (binaire) template class Arbre { public: // … private: T * tab; // ou vector v int cpt; // Nombre d'éléments dans le tableau, inutile si vector }; Implantation par tableau ou vector
121
Implantation en tableau et visite arborescente template void Arbre :: auxAffiche(int i) { if (i<0) throw invalid_argument( Affiche:…. ); if ( i < cpt) {auxAffiche(2*i + 1); /* traitement*/ if(tab[i]!=-1) std::cout << tab[i] << ; auxAffiche(2*i+2); } template void Arbre ::affiche() { auxAffiche(0);} Visite suivant la priorité symétrique
122
Implantation en vector et visite arborescente template void Arbre ::auxAffiche(int i) { if (i<0) throw invalid_argument( Affiche:…. ); if ( i < v.size()) { affiche(2*i + 1); /* traitement*/ if(v[i]!=-1) std::cout << v[i] << ; auxAffiche(2*i+2); } Visite suivant la priorité symétrique
123
Implantation en tableau (2) compaction des niveaux en conservant explicitement l’indice des enfants de gauche et de droite d’un nœud 831124101216914 123456789101112131415 831124101216914 24 68010 000 35 709 01100 0 0 0 0 élément d’information indice du sous-arbre de gauche indice du sous-arbre de droite
124
Implantation en tableau (2) Avantages : aucun trou ! pas besoin d’une sentinelle Désavantages : espace additionnel pour l’information de contrôle (c.-à-d. les indices des éléments enfants d’un nœud) revient à gérer une mémoire utilisée comme le tas («heap») problèmes d’ajouts ? d’enlèvements ? 831124101216914 24 68010 000 35 709 01100 0 0 0 0 Exercice Définissez les attributs privés (modèle d’implantation) en tenant compte de cette version dans l’implantation.
125
La classe Arbre (binaire) template class Arbre { public: //..Les méthodes publiques (i.e. les opérateurs) private: // classe Noeud class Noeud { public: E data; Noeud *gauche; Noeud *droite; int card; int hauteur; Noeud( const E&d ): gauche(0),data( d ),droite(0),hauteur(0) { } }; // Les membres données Noeud * racine;//racine de l'arbre long cpt;// Nombre de noeuds dans l'arbre // Les membres méthodes privés //... };... data Implantation par chaînage
126
Puisque chaque nœud possède au maximum deux nœuds fils, on maintient un pointeur sur chacun d’eux. Avantages: La taille de l’arbre est dynamique. Facile d’opérer sur des pointeurs. Inconvénients: On doit éviter les fuites de mémoire et les doubles références. On ne peut parcourir l’arbre que de la racine vers les feuilles.
127
Implantation par chaînage et visite arborescente template void Arbre :: auxParcoursSymetrique(Nœud* arb, E *res, int &ind) { if (arb==0) return; else { auxParcoursSymetrique(arb->gauche, res, ind); /* traitement*/ res[ind] = arb->info; ind ++; auxParcoursSymetrique(arb->droite, res, ind); } Exercice Redéfinissez le prototype et la définition de la méthode auxParcoursSymetrique() dans le cas de l’utilisation d’un vector au lieu d’un tableau pour recueillir le résultat de la visite.
Présentations similaires
© 2024 SlidePlayer.fr Inc.
All rights reserved.