• Aucun résultat trouvé

Exercice: caractérisation des arbres libres

N/A
N/A
Protected

Academic year: 2022

Partager "Exercice: caractérisation des arbres libres"

Copied!
14
0
0

Texte intégral

(1)

Amphi 6 1

Plan

• Vocabulaire sur les graphes et les arbres

• Arbres équilibrés – Arbres AVL – Arbres a-b

• Quelques compléments de Java

Amphi 6 2

Graphes

Un graphe orienté 5

4 2 1

3

6

Un graphe non orienté 5

4 2 1

3

6 Sommets

arcs

Graphes

Un graphe orienté est un couple G = (S, A) où S est un ensemble de nœuds (ou sommets) et A est une partie de S x S, l'ensemble des arcs.

Un chemin est une suite (s0, s1, ..., sk) de nœuds tels que, pour 1 ! i ! k, (si-1, si) soit un arc. Si s0 = sk et k " 1, on a un circuit. Le chemin est simple si tous les nœuds si sont distincts.

Graphe non orienté : Un arc est une paire de nœuds {s, t} (au lieu d'un couple (s, t)).

Arbres libres

Un graphe est connexe si deux nœuds quelconques sont reliés par un chemin.

Un arbre libre est un graphe non orienté, connexe et sans circuit.

(2)

Amphi 6 5

Exercice: caractérisation des arbres libres

Soit G = (S, A) un graphe non orienté non vide. Les conditions suivantes sont équivalentes :

(1) G est un arbre libre,

(2) Deux nœuds quelconques de S sont connectés par un unique chemin simple, (3) G est connexe, mais ne l'est plus si on retire

une arc quelconque,

(4) G est sans circuit, mais ne l'est plus si on ajoute une arc quelconque,

(5) G est connexe et Card(A) = Card(S) - 1, (6) G est sans circuit et Card(A) = Card(S) - 1.

Amphi 6 6

Arbres enracinés

Un arbre enraciné (ou arbre) est un arbre libre muni d'un nœud distingué, appelé la racine de l'arbre.

Amphi 6 7

Arbres enracinés

Si on change la racine d'un arbre enraciné, on obtient encore un arbre...

Amphi 6 8

Les arbres enracinés en Java

class Arbre { int contenu;

ListeArbre suivant;

}

class ListeArbre { Arbre contenu;

ListeArbre suivant;

}

class Arbre { int contenu;

Arbre[] fils;

}

Solution 1 : la suite des fils est représentée par une liste.

Solution 2 : la suite des fils est représentée par un tableau.

(3)

Amphi 6 9

Plan

• Vocabulaire sur les graphes et les arbres

• Arbres équilibrés – Arbres AVL – Arbres a-b

• Quelques compléments de Java

Amphi 6 10

Performance des arbres de recherche

• Les structures d'arbre permettent de réaliser des opérations dynamiques, telles que recherche, prédécesseur, successeur, minimum, maximum, insertion, et suppression en temps proportionnel à la hauteur de l'arbre.

• Si l'arbre est équilibré, la hauteur est en O(log n) où n est le nombre de nœuds.

• Divers types d'arbres équilibrés sont utilisés : arbres AVL, 2-3, bicolores, b-arbres.

Arbres AVL : définition

Un arbre binaire est un arbre AVL (Adelson-Velskii et Landis) si, pour tout sommet, les hauteurs des sous-arbres gauche et droit diffèrent d’au plus 1.

0 0

1 2 1 0

3 2 4

0 1

0

Implantation : la classe AVL

class Avl {

char contenu;

int hauteur;

Avl filsG, filsD;

Avl(Avl g, char c, Avl d) { filsG = g;

contenu = c;

filsD = d;

hauteur = 1 + Math.max(H(g), H(d));

} ...

}

(4)

Amphi 6 13

Implantation : calculs sur la hauteur

static int H(Avl a)

{ return (a == null) ? -1 : a.hauteur;

}

static void Avl calculerHauteur(Avl a) {

a.hauteur = 1 +

Math.max(H(a.filsG), H(a.filsD));

}

Toutes les méthodes sont dans la classe AVL.

Amphi 6 14

Exemple : arbres de Fibonacci

Amphi 6 15

Hauteur d’un arbre AVL

Propriété. Soit A un arbre AVL ayant n sommets et de hauteur h. Alors

log2(1+n) ! 1+ h ! ! log2(2 + n) avec ! ! 1,44.

Par exemple, si n = 100000, 17 ! h ! 25.

On a toujours

n ! 2h+1 - 1 donc log2(1+n) ! 1+ h .

Amphi 6 16

Hauteur d’un arbre AVL (2)

Soit N(h) le nombre minimum de sommets d’un arbre AVL de hauteur h. Alors

N(h) = 1 + N(h-1) + N(h-2).

h-1 h-2

(5)

Amphi 6 17

Hauteur d’un arbre AVL (2)

La suite F(h) = N(h)+1 vérifie

F(0) = 2, F(1) = 3, F(h+2) = F(h+1) + F(h) donc

F(h) = 1/"5 ("h+3 – "-(h+3)) où " = 1 +2# 5

est le nombre d'or

1 + n # F(h) > 1/"5 ("h+3 – 1) d'où en prenant le logarithme de base "

h+3 < log"("5(2+n)) < log2(2+n) / log2 " + 2

Amphi 6 18

Rotations et équilibrage

Les rotations gauche et droite transforment un arbre

• Elles préservent l'ordre infixe

• Elles se réalisent en temps constant.

q p

U V

W

q p

U

V W

rotation droite

rotation gauche

Implantation (destructive)

q p

U V

W

q p

U

V W

static Avl rotationG(Avl a) { Avl b = a.filsD;

a.filsD = b.filsG;

b.filsG = a;

return b;

}

a

b b

a

rotation droite

rotation gauche

Implantation (non destructive)

q p

U V

W

q p

U

V W

rotation droite

rotation gauche

a

c b

static Avl rotationG(Avl a) {

Avl b = a.filsD;

Avl c =

new Avl(a.filsG, a.contenu, b.filsG);

return new Avl(c, b.contenu, b.filsD);

}

(6)

Amphi 6 21

Double rotation

double rotation droite r

p

U

q X

V W

q p

U V

r

W X

r q

U

p X

V W

rotation gauche autour de p

rotation droite autour de r

Amphi 6 22

Algorithme de rééquilibrage

Soit A un arbre, G et D ses sous-arbres gauche et droit et soient g et d les sous-arbres gauche et droit de G. On suppose que$h(G) – h(D)$ = 2.

• Si h(G) – h(D) = 2,

si h(g) < h(d), on fait une rotation gauche de G, puis une rotation droite de A,

sinon on fait seulement une rotation droite de A.

• Si h(G) – h(D) = -2, opérations symétriques.

Amphi 6 23

Le cas h(G) - h(D) = 2 et h(g) < h(d)

r p

U

q X

V W

q p

U V

r

W X

r q

U

p X

V W

rotation

gauche de G rotation

droite de A

G

d A

D g

d A

g G

d G A

g

Amphi 6 24

Le cas h(G) - h(D) = 2 et h(d) ! h(g)

r p

U

X

p r

X

rotation droite de A

G

q

V W

d A

D g

G g A

U q

V W

d D

(7)

Amphi 6 25

Implantation du rééquilibrage

static Avl equilibrer(Avl a) {

calculerHauteur(a);

if (H(a.filsG) - H(a.filsD) == 2) {

if (H(a.filsG.filsG) <

H(a.filsG.filsD))

a.filsG = rotationG(a.filsG);

return rotationD(a);

} // else

if (H(a.filsG)- H(a.filsD) == -2){...}

return a;

}

Amphi 6 26

Insertion dans un arbre AVL

• Insertion ordinaire, suivie de rééquilibrage.

71 44 37

83 61

50

50 71 44 37

83 61 61

44 37

71 83 50

double rotation autour de «71»

Insertion dans un arbre AVL (suite)

Détail de la double rotation

50 71 44 37

83 61

61 44 37

71 83 50

rotation droite autour de «71»

37

71 61 44

83

50 rotation gauche

autour de «44»

Propriétés (admis)

• Pour rééquilibrer un arbre AVL après une insertion, une seule rotation ou double rotation suffit.

• Pour rééquilibrer un arbre AVL après une suppression, il faut jusqu’à h rotations ou double rotations (h est la hauteur de l'arbre).

(8)

Amphi 6 29

Implantation de l’insertion

static Avl inserer(int x, Avl a) {

if (a == null)

return new Avl(null, x, null);

if (x < a.contenu)

a.filsG = inserer(x, a.filsG);

else if (x > a.contenu)

a.filsD = inserer(x, a.filsD);

// seul changement : return equilibrer(a);

}

Amphi 6 30

Plan

• Arbres équilibrés – Arbres AVL – Arbres a-b

• Quelques compléments de Java

Amphi 6 31

Pourquoi des b-arbres ?

• On doit souvent manipuler de grands volumes de données.

• Si les données ne tiennent pas en mémoire vive, les problèmes d'accès au disque deviennent primordiaux.

• Un seul accès au disque prend environ autant de temps que 200 000 instructions.

• L'utilisation d'un b-arbre minimise le nombre d'accès au disque.

Amphi 6 32

Information sur disque

• Un disque est divisé en pages (par exemple de taille 512, 2048, 4096 ou 8192 octets).

• La page est l'unité de transfert entre mémoire et disque.

• Les informations sont constituées

d'enregistrements, accessibles par une clé.

• Une page contient plusieurs enregistrements.

• Problème : trouver la page contenant l'enregistrement de clé c.

(9)

Amphi 6 33

Arbres de recherche généralisés

34 46 15

8 65

clés

! 8

clés

]8-15] clés ]15-34]

clés ]34-46]

clés ]46-65]

clés

> 65 Chaque noeud interne contient des balises

Amphi 6 34

Arbres de recherche généralisés

Même principe que les arbres binaires de recherche

12 14 11

6

18 8

20 26 30 4 7 10 12 14 17 22 24

21 23 25

27 32 19

Définition d'un arbre a-b (2a - 1 ! b)

• C'est un arbre de recherche généralisé.

• Les feuilles ont toutes la même profondeur.

• La racine a au moins 2 et au plus b fils (sauf si l'arbre est réduit à sa racine).

• Les autres nœuds internes ont au moins a et au plus b fils.

• Lorsque b = 2a - 1, un arbre a-b est appelé un b- arbre d'ordre a-1.

• En pratique, a peut être de l'ordre de plusieurs centaines.

Un arbre 2-4

12 14 11

6

40 20 8

21 26 30 42 4 7 10 12 14 18 21 25 30 36 41 50

Clés Balises

c0 ! k1 < c1 ! ... ! kd < cd 10 ! 11 < 12 ! 12 < 14 ! 14 < 18

(10)

Amphi 6 37

Taille d'un arbre a-b (2a - 1 ! b)

Preuve. Tout nœud a au plus b fils. Il y a donc au plus bh feuilles. Tout nœud autre que la racine a au moins a fils, et la racine au moins 2. Au total, il y a au moins 2ah-1 feuilles.

Proposition. Si un arbre a-b de hauteur h contient n feuilles, alors 2ah-1 ! n ! bh et donc

log n / log b ! h ! 1 + log(n/2) / log a

Amphi 6 38

Recherche dans un arbre a-b (ici 2-4)

12 14 11

6

40 20 8

21 26 30 42 4 7 10 12 14 18 21 25 30 36 41 50

Recherche de 30

Amphi 6 39

Insertion dans un arbre a-b (1)

13 10 6

40 20 8

21 26 30 42 4 7 9 12 14 21 25 30 36 41 50

Insertion de 11:

la balise est min(11, 12)

13 10

9 12 14

10 11 13 9 11 12 14

Amphi 6 40

Insertion dans un arbre a-b (2)

13 10 6

40 20 8

21 26 30 42 4 7 9 12 14 21 25 30 36 41 50

Insertion de 13 : la balise est min(12, 13)

13 10

9 12 14

10 12 13

9 12 13 14

(11)

Amphi 6 41

Eclatement d'un nœud

L'insertion d'un élément peut produire un nœud ayant plus de b fils. Il faut alors éclater le nœud.

21 26 27 21 25 27 30

30 36

21 21 25

27 27 30

30 36 26

12 14 11

6

40 20 8

21 26 30 42 4 7 10 12 14 18 21 25 30 36 41 50

Insertion de 15

12 14 11

40 20 8

10 12 14 18

15 14 11

10 12 14 15 18 20 12

8 40

A éclater !

12

11 6

40 20 8

21 26 30 42 4 7 10 12 14 18 21 25 30 36 41 50

Après insertion de 15

15 14 15

Fusion de deux nœuds

C'est l'opération inverse de l'éclatement.

21 26 27 21 25 27 30

30 36 21

21 25

27 27 30

30

36

26

(12)

Amphi 6 45

Partage de deux nœuds

21 29 30 32 18 26

27

20 21 29 30

32 18 27 26

20

Amphi 6 46

Suppression d'une feuille (1)

Algorithme.

• Supprimer la feuille, puis les balises figurant sur le chemin de la feuille à la racine.

• Si les nœuds ainsi modifiés ont toujours a fils, l’arbre est encore a-b.

• Si un nœud possède seulement a -1 fils, examiner ses frères adjacents.

– Si l'un de ces frères possède au moins a + 1 fils, il suffit de faire un partage avec ce frère.

– Sinon, les frères adjacents ont a fils, la fusion avec l'un deux produit un nœud ayant 2a - 1 ! b fils.

Amphi 6 47

Exemples de suppression (1)

21 26 30 20 25 30 36

Suppression de 25

21 30 20 30 36 21

20 25

racine

20

Amphi 6 48

Suppression de 12 (1)

Suppression de 12

11 6

20 8

21 26 30

4 7 10 12 21 25 30 36

(13)

Amphi 6 49

Suppression de 12 (2)

L'arbre n'est plus 2-4

6

20 8

21 26 30

4 7 10 21 25 30 36

Amphi 6 50

Suppression de 12 (3)

Après partage avec le frère droit.

20 6

21 8

26 30 4 7 10 21 25 30 36

Suppression de 13 (1)

11 6

20 8

21 4 7 10 13 21 25

Suppression de 13

Suppression de 13 (2)

6

20 8

21 4 7 10 21 25

L'arbre n'est plus 2-4

(14)

Amphi 6 53

Suppression de 13 (3)

6

8

21

4 7 21 25

20 10

Après fusion avec le frère droit.

Amphi 6 54

final

La déclaration d'une variable final doit toujours être accompagnée d'une initialisation.

Une méthode final ne peut être surchargée.

Une variable final ne peut être modifiée.

Attention ! Si la variable est un tableau, donc une référence, cette référence ne change plus, mais les valeurs du tableau peuvent être modifiées.

Une classe final ne peut pas avoir de classe dérivée.

Les méthodes d'une classe final sont implicitement final.

Amphi 6 55

final

class Test {

static final int n = 100;

static final int[] a = {1, 2, 3};

public static void main(String args[]) {

a[0] = 5; // OK

n = 9; // Erreur ! Variable finale }

}

Références

Documents relatifs

Alternative au CHS : La structure CHS des disques durs induit un gaspillage de place à la surface du disque dû à la volonté d’intégrer la même quantité de données sur les

• Pour appeler une requête http, il faut invoquer la méthode send() d’un objet de type HTTPService, ici : restaurant. • Cette méthode effectue une requête http ou https en

La performance d'un disque dur influe de manière importante sur la performance générale du système : un disque dur lent aura le potentiel à entraver un processeur rapide

L'ordinateur va en fait charger les données nécessaires dans la RAM : votre véhicule, le circuit, vos concurrents afin d'avoir un jeu fluide, et déchargera ces données à la fin de

Pour ce faire, puisque la plupart d'en- tre nou~ projettent les films devant des associations qui sont des groupes fermés, il fuudrnit faire un effort col- lectif

Un disque (rayon r) est posé dans le coin de la pièce, s’appuyant sur le sol et sur les murs qui forment un trièdre trirectangle.. Calculer la distance du centre du disque au sommet

Ils ne disent pas d'aneries juridiques car dans ma commune il n'existe aucune voie privée ouverte à la circulation, puisqu'elles sont toutes en impasse comme dans le cas de UGO22

La console d'AMP affiche l'erreur « module du kernel non autorisé » quand une demande est faite pour charger une extension du noyau (KEXT) et elle n'est pas approuvée, la