Arbres - CUI - Université de Genève
Transcription
Arbres - CUI - Université de Genève
Arbres Structure existant dans la nature (exploration de l’espace) nids de fourmis, éclairs, neurones, … Structure abstraite dans les organisations, décomposition en parties, plans de recherche, … Présentation (interfaces) des données organisation des fichiers, structure des documents, … Structure efficace en mémoire : arbres de recherche (search trees). G. Falquet, CUI, Université de Genève 1 de 28 Définitions Un arbre avec racine est composé de • ensemble N des noeuds • ensemble A des arêtes paires {n1, n2} d’éléments de N • un noeud particulier r : la racine. Avec deux condition: 1) connexe; 2) sans cycle => un seul chemin de la racine à un noeud donné => un seul chemin entre deux noeuds G. Falquet, CUI, Université de Genève 2 de 28 Terminologie racine o d.=3 0 1 feuille do = 2 noeud intérieur 2 niveaux o d =1 3 4 G. Falquet, CUI, Université de Genève 3 de 28 Définitions Dans une arête racine Noeud parent : le plus proche de la racine Noeud enfant : l’autre Feuilles : les noeuds qui n’ont pas d’enfant parent enfants Noeuds intérieurs : les noeuds qui ne sont ni des feuilles ni la racine. Degré d’un noeud := le nombre de ses enfants Niveau d’un noeud := le nombre d’arc qu’il faut remonter pour atteindre la racine depuis ce noeud Hauteur de l’arbre := le plus grand degré qu’on trouve parmi les noeuds. Arbre ordonné : l’ordre entre les sous-arbre enfants compte . Degré maximum fixé :arbre binaire (2), ternaire (3), etc. G. Falquet, CUI, Université de Genève 4 de 28 Une vue polylithique des arbres Un arbre est • un arbre vide • ou un noeud racine uniquement • ou un noeud racine avec 1 ou plusieurs sous-arbres Ø G. Falquet, CUI, Université de Genève 5 de 28 Une spécification du type arbre n-aire SPECIFICATION Arbre(Element) vide : → arbre; racine : elem → arbre; ajoute: arbre, nat, arbre → arbre; // arbre vide // arbre composé d’un seul noeud // ajoute un sous-arbre à une position donnée n : → nat; est-vide : arbre → bool; sous-arbre : arbre, nat → arbre ; valeur : arbre → elem // constante n G. Falquet, CUI, Université de Genève 6 de 28 AXIOMES est-vide(vide)) == vrai; est-vide(racine(E)) == faux; est-vide(ajoute(A, N, S)) == faux; sous-arbre(vide, N) == vide; sous-arbre( racine(E), N) == vide; sous-arbre(ajoute(A, M, S), N) == S si N = M == sous-arbre(A, N) sinon valeur(racine(E)) == E; PRE ajoute(A, N, S)) == non est-vide(A) PRE valeur(A) == non est-vide(A) PRE ajoute(A, N, S) == N < n G. Falquet, CUI, Université de Genève 7 de 28 Exemple. Construction d’un arbre (notation pointée): noel ← racine("étoile") . ajoute(0, racine("bougie-1")). ajoute(1, (racine("bougie-2"). ajoute(0, racine("boule-1")) . ajoute(1, racine("boule-2")))); étoile bougie-1 bougie-2 boule-1 boule-2 G. Falquet, CUI, Université de Genève 8 de 28 Parcours d’un arbre But : visiter tous les noeuds Il n’y a pas d’ordre canonique pour parcourir un arbre Même pour un arbre ordonné. Deux grandes catégories d’odre de parcours: • en profondeur • en largeur. G. Falquet, CUI, Université de Genève 9 de 28 Parcours en profondeur à partir de la racine on descend dans un sous-arbre, on l’explore complètement, selon le même principe, puis on passe à un autre sous-arbre, et ainsi de suite G. Falquet, CUI, Université de Genève 10 de 28 Algorithme Pour un arbre n-aire a procédure parcourirEnProfondeur(Arbre a) { <<parcourir la racine de a>> pour i de 0 à n–1 { s ← a.sous-arbre(i) parcourirEnProfondeur(s) } G. Falquet, CUI, Université de Genève 11 de 28 Exemple: impression du contenu d’un arbre procédure imprime(Arbre a) { print("("); print(a.valeur); pour i=0 .. n-1 { print(" "); imprime(a.sous-arbre(i)); } print(") "); étoile bougie-1 bougie-2 boule-1 boule-2 } résultat de noel.imprime() : (étoile (bougie-1 ) (bougie-2 (boule-1 ) (boule-2 ) ) ) G. Falquet, CUI, Université de Genève 12 de 28 Cas particulier du parcours des arbres binaires Trois sortes de parcours en profondeur: • pré ordre: on parcourt la racine, puis le sous-arbre gauche, puis le sousarbre droit • post ordre: on parcourt le sous-arbre gauche, puis le sous-arbre droit, puis la racine • en ordre: on parcourt le sous-arbre gauche, puis la racine, puis le sousarbre droit 3 1 2 1 3 2 2 1 3 G. Falquet, CUI, Université de Genève 13 de 28 Parcours en largeur On commence par parcourir tous les noeuds de niveau 1 Puis tous les noeuds de niveau 2 Puis ceux de niveau 3, etc. étoile bougie-1 boule-0 bougie-2 boule-1 boule-2 boule-01 boule-02 boule-03 G. Falquet, CUI, Université de Genève boule-7 14 de 28 L’algorithme général est: procédure parcourirEnLargeur( Arbre a) { Ce_Niveau ← {a} tant que Ce_Niveau est non vide { Niveau_Inferieur ← {} pour chaque arbre s de Ce_Niveau { <<parcourir la racine de s>> Niveau_Inferieur ← Niveau_Inferieur ∪ <<les enfants de s>> } Ce_Niveau = Niveau_Inferieur } } G. Falquet, CUI, Université de Genève 15 de 28 Représentation linéaire des arbres Principe : représenter un arbre sous la forme ( racine enfant0 enfant1 … enfantN) P.ex. (A (B C D) E (F (G (H I) J) K L) ) A B C E D F K G H L J I G. Falquet, CUI, Université de Genève 16 de 28 Exemples d’utilisation des arbres Arbres à lettres Représentation d’expressions arithmétiques Documents structurés (1000000 autres) G. Falquet, CUI, Université de Genève 17 de 28 Les arbres à lettres Manière compacte de représenter un ensemble de mot (p.ex. un lexique). Chaque arc représente une lettre. Un mot est représenté par un chemin de la racine à un noeud “fin de mot”. a x e t n s y d r o m e o m m e t t G. Falquet, CUI, Université de Genève 18 de 28 Arbres à lettres et automates Remarque théorique Un arbre à lettre n’est rien d’autre qu’un automate à état fini qui reconnaît le langage formé des mots donnés. I Intérêt de l’arbre à lettres : Pour tester si le mot [c1, c2, …, ck] appartient au dictionnaire : k étapes depuis la racine => temps de recherche • proportionnel à la longueur du mot cherché • indépendant de la taille du dictionnaire ! G. Falquet, CUI, Université de Genève 19 de 28 La représentation et la manipulation d’expressions On peut représenter une expression arithmétique par un arbre racine : opérateur sous-arbres : opérandes. A1. A2. + 3 * 7 3 - 3+7 4 6 3 * (4 – 6) Permet la manipulations des expressions: G. Falquet, CUI, Université de Genève 20 de 28 Evaluation: L’évaluation consiste à remplacer un (sous-)arbre par la valeur de l’expression qu’il représente. Ainsi, l’arbre A1 ci-dessus sera remplacé par l’arbre constitué du seul noeud (10); pour l’arbre A2 on évalue d’abord le sous-arbre (– 4 6) qui donne –2, puis (* 3 –2) qui donne –6. G. Falquet, CUI, Université de Genève 21 de 28 Simplification: Appliquer des règles de simplification du genre: • remplacer (* 1 expr) ou (* expr 1) par (expr) • remplacer (+ 0 expr) ou (+ expr 0) par (expr) • remplacer (+ (* expr1 x) (* expr2 x)) par (* (+ expr1 expr2) x) + * * * G. Falquet, CUI, Université de Genève x x x expr1 + expr2 expr1 expr2 22 de 28 Dérivation: On peut calculer la dérivé (selon x) d’une formule en appliquant des transformations telles que: d(* cte x) = (cte) d(** x n) = (* n (** x (– n 1))) d(+ f g) = (+ d(f) d(g)) d(* f g) = (+ (* d(f) g) (* f d(g))) etc. Représentation à la base des systèmes de manipulation et de résolution symbolique d’équations mathématiques (Mathematica, Maple, etc.). Utilisées dans les compilateurs pour vérifier le bon typage des expressions et pour les optimiser. G. Falquet, CUI, Université de Genève 23 de 28 Documents structurés Une document structuré : <doc> <titre>Traité du Grand Tout</titre> <section> <paragraphe>On a souvent considéré … </paragraphe> <paragraphe difficulté="3">La capacité à distinguer … </paragraphe> </section> <section domaine="math"> <paragraphe>Dans l’équation <eq>ax+b=0</eq> on remarque que … </paragraphe> <paragraphe difficulté="0">En conclusion … .</paragraphe> </section> </doc> G. Falquet, CUI, Université de Genève 24 de 28 Modèle en arbre Un document est un arbre dont les noeuds sont de 3 catégories : éléments, attributs, textes <doc> <titre> <section> <section> domaine = math "Traité du …" <paragraphe> <paragraphe> difficulté = 3 "On a souvent …" "La capacité …" G. Falquet, CUI, Université de Genève 25 de 28 Manipulation des documents Manipuler un document = manipuler un arbre 1) désigner/sélectionner un noeud particulier (ou ensemble de noeuds) 2) construire des (sous-)arbres Langages XQuery, XPath document("a.xml")/doc//paragraphe G. Falquet, CUI, Université de Genève 26 de 28 Implémentation des arbres On peut réaliser l’implémentation d’une structure d’arbre de manière très simple et directe. Il suffit de définir une classe Noeud dont les objets représentent chacun un noeud de l’arbre et les liens vers les enfants de ce noeud. On obtient le type concret suivant : type variable description T valeur la valeur stockée dans ce noeud, d’un type T quelconque Liste(Noeud) ou Tableau(Noeud) enfants la liste des noeuds racine des sous-arbres enfants Si le nombre maximum d’enfants est fixé on peut utiliser pour la variable enfants un tableau de Noeuds, pour un arbre binaire on utilisera deux variables gauche et droite de type Noeud, dans le cas général on utilisera une liste de Noeud G. Falquet, CUI, Université de Genève 27 de 28 G. Falquet, CUI, Université de Genève 28 de 28