54
Amphi 9 1 Plan Arbres équilibrés – Arbres AVL – Arbres a-b Quelques compléments de Java

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

  • Upload
    others

  • View
    16

  • Download
    0

Embed Size (px)

Citation preview

Page 1: •Arbres équilibrés –Arbres AVL –Arbres a-b •Quelques

Amphi 9 1

Plan

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

• Quelques compléments de Java

Page 2: •Arbres équilibrés –Arbres AVL –Arbres a-b •Quelques

Amphi 9 2

Structures d'arbre

• Les structures d'arbre permettent de réaliser desopérations dynamiques, telles que recherche,prédécesseur, successeur, minimum, maximum,insertion, et suppression en temps proportionnel à lahauteur 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 : arbresAVL, 2-3, bicolores, b-arbres.

Page 3: •Arbres équilibrés –Arbres AVL –Arbres a-b •Quelques

Amphi 9 3

Arbres AVL : définition

Un arbre binaire est un arbreAVL (Adelson-Velskii et Landis)si, pour tout sommet, les hauteursdes sous-arbres gauche et droitdiffèrent d’au plus 1.

00

1 2 01

23

4

01

0

Page 4: •Arbres équilibrés –Arbres AVL –Arbres a-b •Quelques

Amphi 9 4

Exemple : arbres de Fibonacci

Page 5: •Arbres équilibrés –Arbres AVL –Arbres a-b •Quelques

Amphi 9 5

Hauteur d’un arbre AVL

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

log2(1+n) ≤ 1+ h ≤ a log2(2 + n)avec a ≤ 1,44.Par exemple, si n = 100000, 17 ≤ h ≤ 25.

On a toujoursn ≤ 2h+1 - 1

donc log2(1+n) ≤ 1+ h .

Page 6: •Arbres équilibrés –Arbres AVL –Arbres a-b •Quelques

Amphi 9 6

Hauteur d’un arbre AVL (2)

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

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

h-1 h-2

Page 7: •Arbres équilibrés –Arbres AVL –Arbres a-b •Quelques

Amphi 9 7

Hauteur d’un arbre AVL (2)

La suite F(h) = N(h)+1 vérifieF(0) = 2, F(1) = 3, F(h+2) = F(h+1) + F(h)

doncF(h) = 1/√5 (fh+3 – f-(h+3))

où f = 1 +2÷ 5 est le nombre d'or

1 + n ≥ F(h) > 1/√5 (fh+3 – 1)h+3 < log2(2+n) / log2 f + log2 √5 ≤ a log2(2+n) +2

Page 8: •Arbres équilibrés –Arbres AVL –Arbres a-b •Quelques

Amphi 9 8

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

gauche

rotation

droite

Page 9: •Arbres équilibrés –Arbres AVL –Arbres a-b •Quelques

Amphi 9 9

Implantation (non destructive)q

p

U V

Wq

p

U

V W

droite

rotation

gauche

static Arbre rotationG(Arbre a){Arbre b = a.filsD;Arbre c = new Arbre (a.filsG,a.contenu, b.filsG);

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

}

ac b

Page 10: •Arbres équilibrés –Arbres AVL –Arbres a-b •Quelques

Amphi 9 10

Implantation (destructive)q

p

U V

Wq

p

U

V W

droite

rotation

gauche

static Arbre rotationG(Arbre a){Arbre b = a.filsD;a.filsD = b.filsG;b.filsG = a;return b;

}

ab

b

a

Page 11: •Arbres équilibrés –Arbres AVL –Arbres a-b •Quelques

Amphi 9 11

Double rotation

doublerotationdroite

r

p

U

Xq

V W

q

p

U V

r

W Xr

q

U

Xp

V

W

rotationgauche

autour de p

rotationdroite

autour de r

Page 12: •Arbres équilibrés –Arbres AVL –Arbres a-b •Quelques

Amphi 9 12

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

8350

double rotationautour de «71»

Page 13: •Arbres équilibrés –Arbres AVL –Arbres a-b •Quelques

Amphi 9 13

Insertion dans un arbre AVL

• Insertion ordinaire, suivie de rééquilibrage.

50

71

44

37

83

61

61

44

37

71

8350

rotation droiteautour de «71»

37

71

61

44

83

50

rotation gaucheautour de «44»

Page 14: •Arbres équilibrés –Arbres AVL –Arbres a-b •Quelques

Amphi 9 14

Propriétés

• 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 unesuppression, il faut jusqu’à h rotations ou doublerotations (h est la hauteur de l'arbre).

Page 15: •Arbres équilibrés –Arbres AVL –Arbres a-b •Quelques

Amphi 9 15

Algorithme

Algorithme. Soit A un arbre, G et D ses sous-arbres gauche et droit. On suppose que

h(G) – h(D) = 2• Si h(G) – h(D) = 2, on fait une rotation droite.Soient g et d les sous-arbres gauche et droit de G.Si h(g) < h(d), on fait d'abord une rotation gauchede G.• Si h(G) – h(D) = -2, opérations symétriques.

Page 16: •Arbres équilibrés –Arbres AVL –Arbres a-b •Quelques

Amphi 9 16

Implantation : la classe AVLclass 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));

}...

}

Page 17: •Arbres équilibrés –Arbres AVL –Arbres a-b •Quelques

Amphi 9 17

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.

Page 18: •Arbres équilibrés –Arbres AVL –Arbres a-b •Quelques

Amphi 9 18

Implantation des rotations

static Avl rotationG(Avl a){Avl b = a.filsD;Avl c =new Avl(a.filsG, a.contenu, b.filsG);

returnnew Avl(c, b.contenu, b.filsD);

}

Page 19: •Arbres équilibrés –Arbres AVL –Arbres a-b •Quelques

Amphi 9 19

Implantation du rééquilibragestatic 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;

}

Page 20: •Arbres équilibrés –Arbres AVL –Arbres a-b •Quelques

Amphi 9 20

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);

}

Page 21: •Arbres équilibrés –Arbres AVL –Arbres a-b •Quelques

Amphi 9 21

Pourquoi des b-arbres ?

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

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

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

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

Page 22: •Arbres équilibrés –Arbres AVL –Arbres a-b •Quelques

Amphi 9 22

Information sur disque

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

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

• Les informations sont constituéesd'enregistrements, accessibles par une clé.

• Une page contient plusieurs enregistrements.• Problème : trouver la page contenant

l'enregistrement de clé c.

Page 23: •Arbres équilibrés –Arbres AVL –Arbres a-b •Quelques

Amphi 9 23

Arbres de recherche généralisés

34 46158 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

Page 24: •Arbres équilibrés –Arbres AVL –Arbres a-b •Quelques

Amphi 9 24

Arbres de recherche généralisés

Même principe que les arbres binaires de recherche

1214116

188

202630

4 7 10 12 14 17 2224

21 23 25

27 3219

Page 25: •Arbres équilibrés –Arbres AVL –Arbres a-b •Quelques

Amphi 9 25

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.

Page 26: •Arbres équilibrés –Arbres AVL –Arbres a-b •Quelques

Amphi 9 26

Un arbre 2-4

1214116

40208

212630 42

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

Clés

Balises

c0 ≤ k1 < c1 ≤ ... ≤ kd < cd10 ≤ 11 < 12 ≤ 12 < 14 ≤ 14 < 18

Page 27: •Arbres équilibrés –Arbres AVL –Arbres a-b •Quelques

Amphi 9 27

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

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

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

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

Page 28: •Arbres équilibrés –Arbres AVL –Arbres a-b •Quelques

Amphi 9 28

Recherche dans un arbre a-b

1214116

40208

212630 42

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

Recherche de 30

Page 29: •Arbres équilibrés –Arbres AVL –Arbres a-b •Quelques

Amphi 9 29

Insertion dans un arbre a-b (1)

13106

40208

212630 42

4 7 9 12 14 21 25 30 36 41 50

Insertion de 11:la balise estmin(11, 12)

1310

9 12 14

101113

9 11 12 14

Page 30: •Arbres équilibrés –Arbres AVL –Arbres a-b •Quelques

Amphi 9 30

Insertion dans un arbre a-b (2)

13106

40208

212630 42

4 7 9 12 14 21 25 30 36 41 50

Insertion de 13 :la balise estmin(12, 13)

1310

9 12 14

101213

9 12 13 14

Page 31: •Arbres équilibrés –Arbres AVL –Arbres a-b •Quelques

Amphi 9 31

Eclatement d'un nœud

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

212627

21 25 27 30

30

36

21

21 25

27

27 30

30

36

26

Page 32: •Arbres équilibrés –Arbres AVL –Arbres a-b •Quelques

1214116

40208

212630 42

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

Insertion de 15

121411

40208

10 12 14 18

151411

10 12 14 15 18

20128 40A éclater !

Page 33: •Arbres équilibrés –Arbres AVL –Arbres a-b •Quelques

12

116

40208

212630 42

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

Après insertion de 15

15

1415

Page 34: •Arbres équilibrés –Arbres AVL –Arbres a-b •Quelques

Amphi 9 34

Fusion de deux nœuds

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

212627

21 25 27 30

30

36

21

21 25

27

27 30

30

36

26

Page 35: •Arbres équilibrés –Arbres AVL –Arbres a-b •Quelques

Amphi 9 35

Partage de deux nœuds

21 2930

321826

2720 21 2930

321827

2620

Page 36: •Arbres équilibrés –Arbres AVL –Arbres a-b •Quelques

Amphi 9 36

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.

Page 37: •Arbres équilibrés –Arbres AVL –Arbres a-b •Quelques

Amphi 9 37

Exemples de suppression (1)

212630

20 25 30 36

Suppression de 25

2130

20 30 36

21

20 25

20racine

Page 38: •Arbres équilibrés –Arbres AVL –Arbres a-b •Quelques

Amphi 9 38

Suppression de 12 (1)Suppression de 12

116

208

212630

4 7 10 12 21 25 30 36

Page 39: •Arbres équilibrés –Arbres AVL –Arbres a-b •Quelques

Amphi 9 39

Suppression de 12 (2)

L'arbre n'est plus 2-4

6

208

212630

4 7 10 21 25 30 36

Page 40: •Arbres équilibrés –Arbres AVL –Arbres a-b •Quelques

Amphi 9 40

Suppression de 12 (3)

Après partage avecle frère droit.

206

218

2630

4 7 10 21 25 30 36

Page 41: •Arbres équilibrés –Arbres AVL –Arbres a-b •Quelques

Amphi 9 41

Suppression de 13 (1)

116

208

21

4 7 10 13 21 25

Suppression de 13

Page 42: •Arbres équilibrés –Arbres AVL –Arbres a-b •Quelques

Amphi 9 42

Suppression de 13 (2)

6

208

21

4 7 21 2510

L'arbre n'est plus 2-4

Page 43: •Arbres équilibrés –Arbres AVL –Arbres a-b •Quelques

Amphi 9 43

Suppression de 13 (3)

6

8

21

4 7 21 25

20

10

Après fusion avecle frère droit.

Page 44: •Arbres équilibrés –Arbres AVL –Arbres a-b •Quelques

Amphi 9 44

final

La déclaration d'une variable final doit toujours êtreaccompagné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 uneréférence, cette référence ne change plus, mais lesvaleurs 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 implicitementfinal.

Page 45: •Arbres équilibrés –Arbres AVL –Arbres a-b •Quelques

Amphi 9 45

final

class Test{static final int n = 100;static final int[] a = {1, 2, 3};

public static void main(String args[]){a[0] = 5; // OKn = 9; // Erreur ! Variable finale

}}

Page 46: •Arbres équilibrés –Arbres AVL –Arbres a-b •Quelques

Amphi 9 46

Spécial pub. La multiplication par 5

Cet automate réalise la multiplicationpar 5 en binaire inversé.

13 x 5 = 65Entrée : 1011Sortie : 1000001

Page 47: •Arbres équilibrés –Arbres AVL –Arbres a-b •Quelques

Amphi 9 47

Un petit casse-tête (1)

Un joueur a les yeux bandés. Face à lui, un plateau circulairesur lequel sont disposés en carré quatre jetons, blancs d'uncôté et noirs de l'autre. La configuration de départ estinconnue du joueur.Le but du jeu est d'avoir les quatre jetons du côté blanc.

Configurations possibles,à une rotation près.

Page 48: •Arbres équilibrés –Arbres AVL –Arbres a-b •Quelques

Amphi 9 48

Règles du jeu

Le joueur peut retourner autant de jetons qu'il le souhaite, maissans les déplacer. A chaque tour, le maître de jeu annonce si laconfiguration obtenue est gagnante ou pas, puis effectue unerotation du plateau de 0, 1, 2 ou 3 quarts de tours.Peut-on gagner à coup sûr ? En combien de coups ?

Page 49: •Arbres équilibrés –Arbres AVL –Arbres a-b •Quelques

Amphi 9 49

La méthode toString (1)Méthode de la classe java.lang.Object.public String toString()Elle retourne une chaîne de caractères formée par lenom de la classe, suivi de @, du codage du type puisde la référenceB byte J longC char Lnom_de_classe classeD double S shortF float Z booleanI intPrécédé de [ dans le cas d'un tableau

Page 50: •Arbres équilibrés –Arbres AVL –Arbres a-b •Quelques

Amphi 9 50

La méthode toString (2)

public static void main(String args[]){byte[] T = {5, 2, 6};System.out.println(T);

}

>[B@f96da1[ --> TableauB --> de bytes@ --> Adresse, suivi de l'adresse enhéxadécimal

Page 51: •Arbres équilibrés –Arbres AVL –Arbres a-b •Quelques

Amphi 9 51

La méthode toString (2)

Elle est parfois surchargée. Par exemple, dansjava.lang.Class,elle donne seulement le nom de la classe. Dansjava.lang.Stringelle retourne la chaîne de caractères.

public static void main(String[]args) { String p = "bonjour";System.out.println(p);

} // affichera : bonjour

Page 52: •Arbres équilibrés –Arbres AVL –Arbres a-b •Quelques

Amphi 9 52

Les secrets de la classe String

• La classe String est final.• Une chaîne de caractères renvoie toujours à la même

instance de la classe String.• Un tas de méthodes utiles :int length() int charAt(int index)int compareTo(string s)String replace(char c1, char c2)String toLowerCase()String toUpperCase()String valueOf(int i)

Page 53: •Arbres équilibrés –Arbres AVL –Arbres a-b •Quelques

Amphi 9 53

Autres méthodes utiles de la classe String

boolean startsWith(string prefix)boolean endsWith(string suffix)int indexOf(int ch, int from)int indexOf(string facteur)int lastIndexOf(int ch, int from)int lastIndexOf(string facteur)String substring(int i, int j)int indexOf(int c, int fromIndex)int indexOf(string facteur)String substring(int i, int j)String concat(string s), etc.

Page 54: •Arbres équilibrés –Arbres AVL –Arbres a-b •Quelques

Amphi 9 54

La classe String

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

public static void main(String args[]){String s = "bonjour";String t = "bonjour";System.out.println(a == b); // falseSystem.out.println(s == t); // true

}}