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