Rappels Cours : Structures de données arborescentes partie Jean-Stéphane Varré Université Lille jean-stephane.varre@lifl.fr structure de données non linéaire, organisation hiérarchique entre les données stockées, utilisée pour structurer des données : système de fichiers, base de données sites web fichier xml Université Lille, Info 04 - ASD, Licence Informatique S4 Structures arborescentes / Université Lille, Info 04 - ASD, Licence Informatique S4 Structures arborescentes / Vocabulaire Exemple nœud : caractérisé par une valeur + un nombre fini de fils, possède un unique père feuille :nœudsansfils nœud interne :unnœudquin estpasunefeuille arité d un nœud n : nombre de fils du nœud n arité d un arbre a : nombre maximal de fils d un nœud de a racine d un arbre a :c estleseul nœud sans père profondeur d un nœud n : nombre de nœuds sur la branche entre la racine et le nœud n exclu hauteur d un arbre a : c est le nombre de nœuds sur la branche qui va de la racine de a à la feuille de profondeur maximale hauteur 4 7 6 racine noeuds internes feuilles Université Lille, Info 04 - ASD, Licence Informatique S4 Structures arborescentes / Université Lille, Info 04 - ASD, Licence Informatique S4 Structures arborescentes 4/
Structures de données associées Représentation chaînée Cas où l arité n est pas bornée type a arbre = Vide Cons of a noeud and a noeud = { valeur : a; 4 fils : a arbre list (* mais aussi un tableau, une table de hachage,... *) 6 } Cas où l arité est bornée (ici un arbre à fils maximum) type a arbre = Vide Cons of a noeud and a noeud = { valeur : a; 4 gauche : a arbre; droit : a arbre 6 } Exemple tiré du cours d API. Université Lille, Info 04 - ASD, Licence Informatique S4 Structures arborescentes / Université Lille, Info 04 - ASD, Licence Informatique S4 Structures arborescentes 6/ Hauteur, profondeur, arité Parcours en profondeur Soit A un arbre d arité a, detaillen et de hauteur h. le nombre n p de nœuds de A à profondeur 0 apple p apple h vérifie apple n p apple a p la taille n vérifie l encadrement On traite récursivement les nœuds de l arbre. Trois sens de parcours : préfixé : traiter la racine puis les fils de gauche à droite, postfixé : traiter les fils de gauche à droite puis la racine, infixé (n a vraiment de sens que pour les arbres binaires) : traiter le fils de gauche, puis la racine, puis le fils de droite h +apple n apple ah+ a le hauteur h vérifie l encadrement Tiré du cours d API log a (n(a ) + ) apple h apple n Exemple a b d g h e c f infixé postfixé préfixé b, g, d, h, a, e, c, f g, h, d, b, e, f, c, a a, b, d, g, h, c, e, f Université Lille, Info 04 - ASD, Licence Informatique S4 Structures arborescentes 7/ Université Lille, Info 04 - ASD, Licence Informatique S4 Structures arborescentes /
Parcours en profondeur - récursif Parcours en profondeur - itératif avec pile procedure AffichagePrefixe(a) si a n est vide alors (* traitement de la racine *) a cher la valeur de la racine (* traitement des fils gauche et droit *) AffichagePrefixe(fils gauche de a) AffichagePrefixe(fils droit de a) fin procedure Note : pour changer le type de parcours il su instructions du if. Comment dérécursiver le parcours? t d échanger les trois procedure AffichagePrefixe(a) soit p une pile d arbres empiler a dans p tant que p n est pas vide faire (* on traite l arbre au sommet de la pile *) s sommet de p dépiler p si s n est pas vide alors a cher la valeur de la racine de s empiler le fils droit de s dans p empiler le fils gauche de s dans p fin tant que fin procedure Il ne faut pas se tromper et bien empiler le sous-arbre droit avant le sous-arbre gauche car la pile est une structure LIFO. Université Lille, Info 04 - ASD, Licence Informatique S4 Structures arborescentes / Université Lille, Info 04 - ASD, Licence Informatique S4 Structures arborescentes 0/ Parcours en largeur Parcours en largeur - itératif avec file On traite les nœuds, des moins profonds aux plus profonds, par strates. Exemple b g d a h e c f a,b,c,d,e,f,g,h Comment réaliser un tel parcours? procedure AffichageEnLargeur(a) soit f une file d arbres tant que f n est pas vide faire s tête de f défiler f si s n est pas vide alors a cher la racine de s enfiler le fils gauche de s dans f enfiler le fils droit de s dans f fin tant que fin procedure Université Lille, Info 04 - ASD, Licence Informatique S4 Structures arborescentes / Université Lille, Info 04 - ASD, Licence Informatique S4 Structures arborescentes /
Rappel sur les arbres binaires un arbre binaire est un arbre dont chaque nœud possède au plus deux fils un arbre binaire complet est un arbre binaire dont tous les nœuds internes possèdent exactement deux fils un arbre binaire parfait est un arbre binaire complet pour lequel toutes les feuilles sont à la même profondeur un arbre binaire quasi parfait de hauteur h est un arbre binaire tel que : toutes les feuilles sont à profondeur h ou h, dont tous les nœuds internes sauf eventuellement un à profondeur h possèdent deux fils, et toutes les feuilles de profondeur h sont groupées à gauche. Une nouvelle structure de données : le tas Université Lille, Info 04 - ASD, Licence Informatique S4 Structures arborescentes / Tas un tas max est un arbre binaire quasi-parfait dont la valeur associée à chaque nœud est plus grande que celles de ses fils Trier avec un tas? Comment faire? Idée : extraire la valeur maximale, puis la seconde, etc... propriétés : la valeur la plus grande est située à la racine du tas pas d ordre entre les valeurs des fils d un nœud (ce n est pas un arbre binaire ordonné!) mais la seconde valeur maximale est nécessairement la valeur d un des deux fils de la racine la hauteur d un tas de taille n est h = blog nc Université Lille, Info 04 - ASD, Licence Informatique S4 Structures arborescentes / extraire la racine, remonter la seconde valeur maximale à la racine recommencer récursivement Université Lille, Info 04 - ASD, Licence Informatique S4 Structures arborescentes 6/
Implantation d un tas si le tas est utilisé pour un tri, alors le nombre d éléments est borné on peut alors utiliser une structure statique plutôt qu une structure dynamique!! Problème : l arbre obtenu n est plus un tas puisque ce n est plus un arbre quasi parfait les fils d un nœud représenté à l indice i se trouvent en positions i +et i + 0 4 Université Lille, Info 04 - ASD, Licence Informatique S4 Structures arborescentes / Suppression de l élément maximum!! Problème : l arbre obtenu n est plus un tas puisque ce n est plus un arbre quasi parfait Université Lille, Info 04 - ASD, Licence Informatique S4 Structures arborescentes / Université Lille, Info 04 - ASD, Licence Informatique S4 Structures arborescentes /
procedure ReorganiserTas(t) p racine du tas repéter g le fils gauche de p d le fils droit de p (* recherche du max entre le fils gauche et droit *) max p si g 6= Videet valeur(max) < valeur(g) alors max g si d 6= Videet valeur(max) < valeur(d) alors max d (* arr^et lorsqu on ne peut plus descendre dans l arbre *) fini p =max si non fini alors é c h a n g e r l e s v a l e u r s d e s n œ u d s p et max jusqu à fini fin procedure Implantation de la suppression du maximum type a tas = { mutable taille : int; le_tas : a array 4 } 6 (** 7 supprimer [tas] : supprime l element max du [tas] et le retourne a tas -> a *) 0 let supprimer_max tas = let max = tas.le_tas.(0) in tas.le_tas.(0) <- tas.le_tas.(tas.taille-); 4 tas.taille <- tas.taille - ; if tas.taille >= then reorganiser tas 0; 6 max Université Lille, Info 04 - ASD, Licence Informatique S4 Structures arborescentes / Implantation de la réorganisation Complexité de la réorganisation et de la suppression let reorganiser tas = let fini = ref false and pere = ref 0 4 in while not!fini do 6 let g = *!pere + (* indice du fils gauche *) 7 and d = *!pere + (* indice du fils droit *) and imax = ref!pere (* indice du maximum *) in 0 (* recherche du max entre le fils gauche et droit *) if g < tas.taille && tas.le_tas.(!imax) < tas.le_tas.(g) then imax := g; if d < tas.taille && tas.le_tas.(!imax) < tas.le_tas.(d) then 4 imax := d; (* arret lorsqu on ne peut plus descendre dans l arbre *) 6 fini := (!pere =!imax); 7 if not!fini then echanger tas.le_tas!pere!imax; pere :=!imax 0 done Réorganisation : à chaque tour de boucle, dans le pire des cas, on descend dans l arbre, et on a un échange d éléments un tas a une hauteur blog nc, la boucle est donc réalisée log n fois au maximum la complexité est donc en O(log n) Suppression : on a un échange d éléments + une réorganisation la complexité est donc en O(log n) Université Lille, Info 04 - ASD, Licence Informatique S4 Structures arborescentes 4/ Université Lille, Info 04 - ASD, Licence Informatique S4 Structures arborescentes /
Création d un tas comment construire le tas à partir d un ensemble de valeurs quelconque? la dernière moitié du tableau représente les feuilles, les feuilles sont des tas, mais pas les sous-arbres idée : réorganiser les sous-arbres en commençant par les plus profonds 7 7 7 7 7 Modification de reorganiser Paramètre indiquant le nœud racine du sous-arbre à réorganiser. let reorganiser tas p = let fini = ref false and pere = ref p 4 in while not!fini do 6 let g = *!pere + (* indice du fils gauche *) 7 and d = *!pere + (* indice du fils droit *) and imax = ref!pere (* indice du maximum *) in 0 (* recherche du max entre le fils gauche et droit *) if g < tas.taille && tas.le_tas.(!imax) < tas.le_tas.(g) then imax := g; if d < tas.taille && tas.le_tas.(!imax) < tas.le_tas.(d) then 4 imax := d; (* arret lorsqu on ne peut plus descendre dans l arbre *) 6 fini := (!pere =!imax); 7 if not!fini then echanger tas.le_tas!pere!imax; pere :=!imax 0 done Université Lille, Info 04 - ASD, Licence Informatique S4 Structures arborescentes 7/ Université Lille, Info 04 - ASD, Licence Informatique S4 Structures arborescentes / Implantation de la création Complexité de la création (** a array -> a tas *) 4 let creer t = let n = Array.length t 6 in 7 let tas = { taille = n; le_tas = Array.copy t } in (* reorganisation de t *) 0 for i = tas.taille / downto 0 do reorganiser tas i; done; tas En première approche : une boucle sur la moitié du tableau : n chaque réorganisation est en O(log n) d où une complexité en O(n log n) Université Lille, Info 04 - ASD, Licence Informatique S4 Structures arborescentes / Université Lille, Info 04 - ASD, Licence Informatique S4 Structures arborescentes 0/
Complexité de la création Implantation du tri Plus finement : à la construction, la réorganisation se fait sur des sous-arbres de hauteur di é r e n t e s : d e 0 à blog nc nombre de sous-arbres de hauteur i : h si i est la hauteur d un sous-arbre, le coût de la réorganisation est O(i) on en déduit que la complexité est!! hx hx h i O(i) =O h i X i = O n = O(n ) = O(n) i i i=0 avec P i i=0 = i ( = ) i=0 i=0 i (** a array -> a array *) 4 let trier t = let tas = creer t 6 in 7 while tas.taille >= do (* extraction de la valeur maximale de t dans v et reorganisaton *) let v = supprimer_max tas 0 in (* rangement de la valeur maximale dans a *) tas.le_tas.(tas.taille) <- v done; 4 tas.le_tas Université Lille, Info 04 - ASD, Licence Informatique S4 Structures arborescentes / Université Lille, Info 04 - ASD, Licence Informatique S4 Structures arborescentes / Complexité du tri création en O(n) + boucle sur la taille du tableau : n suppression de l élément maximum en O(log n) tri en O(n log n) Université Lille, Info 04 - ASD, Licence Informatique S4 Structures arborescentes /