Académique Documents
Professionnel Documents
Culture Documents
• Arbres équilibrés
– Arbres AVL
– Arbres a-b
• Quelques compléments de Java
Amphi 9 1
Structures d'arbre
0 0 1 0
Amphi 9 3
Exemple : arbres de Fibonacci
Amphi 9 4
Hauteur d’un arbre AVL
On a toujours
n ≤ 2h+1 - 1
donc log2(1+n) ≤ 1+ h .
Amphi 9 5
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
Amphi 9 6
Hauteur d’un arbre AVL (2)
Amphi 9 7
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
droite
p rotation q
gauche U
W
U V V W
Amphi 9 8
Implantation (non destructive)
q droite a p
c p rotation q b
W U
gauche
U V V W
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);
}
Amphi 9 9
Implantation (destructive)
b q droite a p
a p rotation q b
W U
gauche
U V V W
static Arbre rotationG(Arbre a)
{
Arbre b = a.filsD;
a.filsD = b.filsG;
b.filsG = a;
return b;
}
Amphi 9 10
Double rotation
r q
double
p p r
rotation
X droite
q
U U V W X
r
V W
q
rotation X rotation
p
gauche droite
W
autour de p autour de r
U V
Amphi 9 11
Insertion dans un arbre AVL
Amphi 9 12
Insertion dans un arbre AVL
71 rotation gauche 71
autour de «44»
44 83 61 83
37 61 44
50 37 50
61
44 71 rotation droite
autour de «71»
37 50 83
Amphi 9 13
Propriétés
Amphi 9 14
Algorithme
Amphi 9 15
Implantation : la classe AVL
class Avl
{
char contenu;
int hauteur;
Avl filsG, filsD;
Amphi 9 17
Implantation des rotations
Amphi 9 18
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 9 19
Implantation de l’insertion
Amphi 9 20
Pourquoi des b-arbres ?
Amphi 9 21
Information sur disque
8 15 34 46 65
clés
clés ]8-15] clés clés
≤8 ]15-34] ]46-65]
clés
clés > 65
]34-46]
Amphi 9 23
Arbres de recherche généralisés
Même principe que les arbres binaires de recherche
8 18
6 11 12 14 20 26 30
4 7 10 12 14 17 19 22 24 27 32
21 23 25
Amphi 9 24
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.
Amphi 9 25
Un arbre 2-4
Balises
8 20 40
6 11 12 14 21 26 30 42
4 7 10 12 14 18 21 25 30 36 41 50
Amphi 9 27
Recherche dans un arbre a-b
8 20 40
6 11 12 14 21 26 30 42
4 7 10 12 14 18 21 25 30 36 41 50
Recherche de 30
Amphi 9 28
Insertion dans un arbre a-b (1)
8 20 40
6 10 13 21 26 30 42
4 7 9 12 14 21 25 30 36 41 50
Insertion de 11: 10 13 10 11 13
la balise est
min(11, 12)
9 12 14 9 11 12 14
Amphi 9 29
Insertion dans un arbre a-b (2)
8 20 40
6 10 13 21 26 30 42
4 7 9 12 14 21 25 30 36 41 50
10 13 10 12 13
Insertion de 13 :
la balise est
min(12, 13) 9 12 14 9 12 13 14
Amphi 9 30
Eclatement d'un nœud
26
21 26 27 30 21 27 30
21 25 27 30 36 21 25 27 30 36
Amphi 9 31
Insertion de 15 8 20 40
6 11 12 14 21 26 30 42
4 7 10 12 14 18 21 25 30 36 41 50
8 20 40 8 12 20 40
A éclater !
11 12 14 11 14 15
10 12 14 18 10 12 14 15 18
Après insertion de 15
12
8 20 40
6 11 14 15 21 26 30 42
4 7 10 12 14 15 18 21 25 30 36 41 50
Fusion de deux nœuds
26
21 27 30 21 26 27 30
21 25 27 30 36 21 25 27 30 36
Amphi 9 34
Partage de deux nœuds
18 26 32 18 27 32
20 21 27 29 30 20 21 26 29 30
Amphi 9 35
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 9 36
Exemples de suppression (1)
Suppression de 25
21 26 30 21 30
20 25 30 36 20 30 36
racine 21
20
20 25
Amphi 9 37
Suppression de 12 (1)
Suppression de 12
8 20
6 11 21 26 30
4 7 10 12 21 25 30 36
Amphi 9 38
Suppression de 12 (2)
L'arbre n'est plus 2-4
8 20
6 21 26 30
4 7 10 21 25 30 36
Amphi 9 39
Suppression de 12 (3)
Après partage avec
le frère droit.
8 21
6 20 26 30
4 7 10 21 25 30 36
Amphi 9 40
Suppression de 13 (1)
Suppression de 13
8 20
6 11 21
4 7 10 13 21 25
Amphi 9 41
Suppression de 13 (2)
L'arbre n'est plus 2-4
8 20
6 21
4 7 10 21 25
Amphi 9 42
Suppression de 13 (3)
Après fusion avec
le frère droit.
8
6 20 21
4 7 10 21 25
Amphi 9 43
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 9 44
final
class Test
{
static final int n = 100;
static final int[] a = {1, 2, 3};
Amphi 9 45
Spécial pub. La multiplication par 5
13 x 5 = 65
Entrée : 1011
Sortie : 1000001
Configurations possibles,
à une rotation près.
Amphi 9 47
Règles du jeu
Le joueur peut retourner autant de jetons qu'il le souhaite, mais
sans les déplacer. A chaque tour, le maître de jeu annonce si la
configuration obtenue est gagnante ou pas, puis effectue une
rotation du plateau de 0, 1, 2 ou 3 quarts de tours.
Peut-on gagner à coup sûr ? En combien de coups ?
Amphi 9 48
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 le
nom de la classe, suivi de @, du codage du type puis
de la référence
B byte J long
C char Lnom_de_classe classe
D double S short
F float Z boolean
I int
Précédé de [ dans le cas d'un tableau
Amphi 9 49
La méthode toString (2)
public static void main(String args[])
{
byte[] T = {5, 2, 6};
System.out.println(T);
}
>[B@f96da1
[ --> Tableau
B --> de bytes
@ --> Adresse, suivi de l'adresse en
héxadécimal
Amphi 9 50
La méthode toString (2)
Elle est parfois surchargée. Par exemple, dans
java.lang.Class,
elle donne seulement le nom de la classe. Dans
java.lang.String
elle retourne la chaîne de caractères.
Amphi 9 51
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)
Amphi 9 52
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.
Amphi 9 53
La classe String
class Test
{
static final int[] a = {1, 2, 3};
static final int[] b = {1, 2, 3};