1 ALGORITHMES ET COMPLEXITÉ

Transcription

1 ALGORITHMES ET COMPLEXITÉ
NFP136- Cours 7
ARBRES DE RECHERCHE
PLAN
• Arbres binaires de recherche
• Arbre h-équilibrés
1
7.1 ARBRES BINAIRES DE
RECHERCHE
Définition
Arbre binaire tel qu’en tout nœud la
clé du nœud est supérieure à celle de
tous ses descendants de gauche et
inférieure à celle de tous ses
descendants de droite
2
EXEMPLE
11
15
8
clé min 5
10
6
12
30
21
35 clé max
25
3
RAPPEL: Voir cours n° 3 sur les arbres
ABR:
structures de données pour grands
volumes variables d'informations
structures dynamiques
Arbre binaire a
a.g = sous-arbre de gauche de racine(a)
a.d = sous-arbre de droite de racine(a)
Clés une donnée → une clé
{clés} ensemble totalement ordonné
4
class ABR {
private int cle;
private String element;
private ABR gauche;
private ABR droit;
public ABR(int a, String s, ABR g, ABR d) {
cle = a;
element = s;
gauche= g;
droit=d;
}
//les méthodes
5
Recherche :
descente de l’arborescence avec
comparaison en chaque nœud
EXEMPLE
11
recherche de 21
15
8
10
5
6
12
30
21
35
25
6
principe de la recherche de l'élément e de
clé c dans l'arbre a
précondition: c∈a
recherche(c,a) renvoie String
si c == a.cle
alors retourner (a.element )
//élément de la racine de a
sinon
si c< a.cle
alors retourner (recherche(c, a.gauche))
sinon retourner (recherche(c, a.droit))
finsi
finsi
complexité: O(h(a))7
ADJONCTION D’UN ELEMENT
EXEMPLE
ajout de 14
11
15
8
10
5
6
complexité: O(h(a))
12
30
14 21
place
25
35
8
adjonction dans a d'un élément e
ABR ajouter (ABR a, String e, int c)
de clé c
b=a;
si b == null alors b=new ABR (c, e, null, null ) ;
sinon tant que non place_trouvée faire
si b.cle == c alors "erreur" //élément déjà présent
si b.cle > c
alors //descendre à gauche
si b.gauche == null alors place_trouvée=vrai //fils gauche de b
b.gauche=new ABR (c, e, null, null ) ;
sinon b = b.gauche;
finsi;
sinon //descendre à droite
si b.droit == null alors place trouvée=vrai //fils droit
b.droit=new ABR (c, e, null, null ) ;
sinon b =b.droit;
finsi;
finsi;
fait;
finsi;
retourner b;
9
suppression d'un nœud N
cas 1: N est une feuille
cas 2: N a un seul fils F
cas 3: N a 2 fils
( 2 cas cas 3-1 cas 3-2)
10
10
EXEMPLE
8
15
5
12
6
3
11
c3-2
14
30
21
35
c3-1
2
4
suppression d'une feuille cas 1 (11)
sup. d'un nœud sans fils droit cas 2 (8)
sup. de nœuds avec 2 fils
cas 3-1 (15) puis cas 3-2 (16)
17
16
23
19
18
20
11
10
EXEMPLE
8
15
5
6
3
2
12
11
30
14
4
21
17
16
35
23
19
suppression d'une feuille cas 1 (11)
sup. d'un nœud sans fils droit cas 2 (8)
18
20
12
10
EXEMPLE
15
5
6
3
2
4
12
30
14
21
17
16
suppression d’un nœud avec 2 fils
cas 3-1 (15)
35
23
19
18
20
13
10
EXEMPLE
16
5
6
3
2
4
12
30
14
21
17
35
23
19
suppression d’un nœud avec 2 fils
cas 3-2 (16)
18
20
14
10
EXEMPLE
17
5
6
3
2
4
12
30
14
21
19
18
35
23
20
15
o'
cas 2
o
a
o'
b
o'
a
b
o
a
b
C. Carrez
16
Cas 3.2
o'
o'
o"
o
a
a
b
o"
d
d
b
c
c
C. Carrez
17
suppression d'un nœud N
cas 1: N est une feuille
→ suppression simple
cas 2: N a un seul fils F
→ F prend la place de N
(remontée du sous-arbre)
cas 3: N a 2 fils
→ est remplacé par le nœud de plus
petite clé de son sous-arbre de droite
cas 3-1:
c'est une feuille
cas 3-2:
ce noeud n'a qu'un fils
droit qui prend sa place
18
cas 3
a a 2 fils:
rechercher le plus petit du sous-arbre de droite
f = a.d;
tant que f.g≠Ø faire f=f.g fait;
a.element = f.element;
a.cle=f.cle; l'élément de f remplace l'élément supprimé
f = f.d; si f n'a pas de fils gauche remonter le fils droit de f;
f.d =Ø si f feuille
Complexité de la suppression: O(h(a))
19
Conclusion arbre binaire de recherche
• recherche,
adjonction,
suppression
complexité: O(h(a))
avec log2n ≤ h(a) ≤ n-1
complexité en moyenne: O(log n)
• problème:
éviter les cas défavorables
→ arbres équilibrés
20
équilibre
arbre non équilibré:
r
a
c
g
b
d
e
f
j
arbre équilibré:
k
r
a
c
i
g
b
e
d
f
les feuilles sont sur au plus 2 niveaux
21
7.2 ARBRES H-EQUILIBRES
définition: Arbre tel qu’en tout nœud la différence
de hauteur entre les sous-arbres gauche et droit
est au plus de 1
déséquilibre:
déseq(a) = h(a.g)-h(a.d)
déseq(a) = 0 si a = Ø
arbre H-équilibré
pour tout b sous-arbre de a,
déséq(b) ∈ {-1, 0, +1}
arbre H-équilibré ⇒ log2(n+1) ≤h + 1 ≤ 1.45log2(n+1)
22
arbre AVL:
arbre binaire de recherche
H-équilibré
⇒
la recherche dans un arbre AVL est
au pire en Ο(log2 n)
o
h
h-1
(en O(log(n))
(ou+ou- 1)
problème: maintenir l’équilibre
23
notations des déséquilibres:
=
-+
++
si h(a.g) = h(a.d)
si h(a.g) = h(a.d)-1
si h(a.g) = h(a.d)-2
si h(a.g) = h(a.d)+1
si h(a.g) = h(a.d)+2
10 =
4-
17
12
=
6
3
5
++
8
14
24
1 7
exemple de rotation
3 0
2 1
1 9
1 8
=
++
+
3 5
2 3
2 0
1 7
2 1 =
1 9
Ré-équilibrage 1
1 8
=
2 0
3 0
2 3
=
3 5
25
rééquilibrage: rotation à droite
A
o++
o' +
D
h
h
h-1
h
-
1
C
h-3
B
h-3
h-2
h
-
3
déséquilibre(A)=2, et
déséquilibre(A.g))=1 ou 0 ⇒
o
o
rotation à
droite
A '
=
'
o
=
h
-
1
h -1
h -2
h
B
C
-
2
D
D
C. Carrez
h -2
h -3
h -3
26
4 0 ++
17
-
12
50
30
14
21
19
+
45
52
35
23
27
17 - 12
40
30
14
21
19
+
+
35
50
45
52
23
La rotation simple apporte un nouveau déséquilibre:
double rotation nécessaire
28
+ +
4 0
2
1 7
-
50
1
1 2
3 0
+
4 5
5 2
+ +
4 0
3 0
1 4
2 1
2
3 5
3 5
1 7
1 9
2 3
1 2
Ré-équilibrage 2
1 7
3 0
=
4 0
1 9
2 3
2 3
-
3 5
2 1
1 4
1 9
1 4
=
1 2
2 1
5 0
4 5
5 2
29
rotation gauche-droite
A
o
++
-
o'
h
E
o"
h -1
h -2
h -3
B
C
h -3
D
h - 3 ( +/- 1 )
h - 3 ( + /- 1 )
déséq(A)=2, déséq(g(A))= -1 ⇒ rotation gauche-droite
A '
o" =
o
o'
h -1
h -2
C
D
B
C. Carrez
h -3
h -3
(+ / - 1 )
h -3
( + / -1 )
E
h -3
30
adjonction et suppression
même principe que dans un arbre binaire de
recherche mais en rééquilibrant par rotations après
l'opération si c'est nécessaire (si a n'est plus H
équilibré)
Dans les arbres AVL
recherche
adjonction
suppression
en Ο(log2n)
On constate expérimentalement:
en moyenne 1 rotation pour 2 adjonctions
en moyenne 1 rotation pour 5 suppressions
31
Exemple
71
83
44
37
61
C’est bien un AVL
32
Exemple
71 ++
83
44 37
61
50
Insertion de 50. ABR mais non AVL
33
Exemple
71 ++
83
44 37
Double rotation gauche puis droite
61
50
71
61
83
44
37
50
34
Exemple
71 ++
83
44 37
Double rotation gauche puis droite
61
50
71
61
61
83
71
44
puis
AVL
44
83
37
37
50
50
35