• Aucun résultat trouvé

(1)Parcours d'arbres Préfixe VGD) Infixe GVD) Suffixe GDV X, Petite classe 5 X, Petite classe 7 typedef struct Noeud { Element contenu

N/A
N/A
Protected

Academic year: 2022

Partager "(1)Parcours d'arbres Préfixe VGD) Infixe GVD) Suffixe GDV X, Petite classe 5 X, Petite classe 7 typedef struct Noeud { Element contenu"

Copied!
23
0
0

Texte intégral

(1)

Parcours d'arbres

Préfixe : 1, 2, 4, 8, 9, 5, 10, 3, 6, 7 (VGD)

Infixe : 8, 4, 9, 2, 10, 5, 1, 6, 3, 7 (GVD)

Suffixe : 8, 9, 4, 10, 5, 2, 6, 7, 3, 1 (GDV)

1

2 3

4 5 6 7

8 9 10

(2)

X, Petite classe 5 X, Petite classe 7

typedef struct Noeud

{ Element contenu;

struct Noeud *filsG;

struct Noeud *filsD;

}*Arbre;

void ParcoursPrefixe(Arbre a) { if (a != NULL)

{ printf("%3d", a->contenu);

ParcoursPrefixe(a->filsG);

ParcoursPrefixe(a->filsD);

} }

(3)

void ParcoursInfixe(Arbre a) { if (a != NULL)

{ ParcoursInfixe(a->filsG);

printf("%3d", a->contenu);

ParcoursInfixe(a->filsD);

} }

void ParcoursSuffixe(Arbre a) { if (a != NULL)

{ ParcoursSuffixe(a->filsG);

ParcoursSuffixe(a->filsD);

printf("%3d", a->contenu);

} }

(4)

X, Petite classe 5 X, Petite classe 7

Propriété de base : Pour chaque noeud de valeur v, les noeuds du sous-arbre gauche ont une valeur

< v et ceux du sous-arbre droit ont une valeur > v.

Arbres de recherche

10 13

8 14 16 21

12 19

15

17

(5)

Exercices

(1) Montrer que le parcours infixe ordonne les nœuds par valeur croissante.

(2) Montrer que si un nœud a deux fils, son successeur dans l'ordre infixe n'a pas de fils gauche et son prédécesseur n'a pas de fils droit.

(3) Montrer que le successeur du nœud n est le sommet le plus à gauche dans le sous-arbre droit issu de n.

(6)

X, Petite classe 5 X, Petite classe 7

Arbre Recherche(Element v, Arbre a) { if (a == NULL || v == a->contenu)

return a;

if (v < a->contenu)

return Recherche(v, a->filsG);

return Recherche(v, a->filsD);

}

Recherche

(7)

Arbre NouvelArbre(Element v, Arbre a, Arbre b)

{ Arbre c;

c = (Arbre)malloc (sizeof (struct Noeud ));

c->contenu = v;

c->filsG = a;

c->filsD = b;

return c;

}

void AjouterArbre(Element v, Arbre *ap) { Arbre a = *ap;

if (a == NULL )

a = NouvelArbre(v, NULL , NULL);

else if (v <= a->contenu)

AjouterArbre(v, &a->filsG);

elseAjouterArbre(v, &a->filsD);

*ap = a;

}

Ajout d'un élément

(8)

X, Petite classe 5 X, Petite classe 7

Suppression

(a) le noeud est une feuille : on le supprime

10

8 14 16 21

12 19

15

13 17 10

8 14 16 21

12 19

15

17

(b) le noeud est un a un seul fils : on la supprime

10

8 13 16 21

12 19

15

13 17 10

8 14 16 21

12 19

15

17

(9)

(c) le noeud s a deux fils : on supprime son successeur t (qui n'a pas de fils gauche), mais on remplace la valeur de s par celle de t.

10 13

8 14 16 21

12 19

15

17 10 13

8 14 16 21

12 19

15

17

10 13

8 14 17 21

12 19

16

(10)

void SupprimerArbre(Element v, Arbre *ap) { Arbre a = *ap;

if (a == NULL)

*ap = a;

else if (v < a->contenu)

SupprimerArbre(v, &a->filsG);

else if (v > a->contenu)

SupprimerArbre(v, &a->filsD);

else if (a->filsG == NULL)

*ap = a->filsD;

else if (a->filsD == NULL )

*ap = a->filsG;

else (*ap)->contenu =

SupprimerSuccesseur(&a);

}

Element SupprimerSuccesseur(Arbre *ap) { Arbre a = *ap;

Element v;

if (a->filsG == NULL ) { v = a->contenu;

a = NULL ; return v;

}return SupprimerSuccesseur(&(a->filsG));

}

(11)

• O(log n) si l'arbre est équilibré

• O(n) si l'arbre est filiforme --> D'où l'intérêt des arbres

équilibrés!

• Arbre AVL (Adel'son-Vel'skii et Landis) : pour tout noeud, la

différence de hauteur entre les sous-arbres gauche et droit est égale à -1, 0 ou 1.

Exemple : les tas

Hauteur d'un arbre AVL : O(log n) Temps de calcul

(12)

X, Petite classe 5 X, Petite classe 7

typedef struct NoeudAVL

{ int balance;

Element contenu;

struct NoeudAVL *filsG;

struct NoeudAVL *filsD;

}*ArbreAVL;

(13)

Théorème. Soit un arbre AVL de hauteur h à n sommets. Alors

log2(1 + n) 1 + h 1,44 log2(1 + n)

Preuve. Pour une hauteur h donnée, le nombre maximum de sommets est atteint pour l'arbre complet à 2h+1 - 1 sommets.

Hauteur 0 : • Hauteur 1 :

Hauteur 2 :

Donc n 2h+1 -1 et log2(1 + n) 1 + h

• •

(14)

X, Petite classe 5 X, Petite classe 7

Soit N(h) le nombre minimum de sommets d'un arbre AVL de hauteur h. On a

N(0) = 0 N(1) = 2

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

Donc F(h) = N(h) + 1 vérifie F(0) = 2 F(1) = 3 F(h) = F(h-1) + F(h-2) d'où F(h) = Fh+3 =

1 [(1 + 5)h+3 - (1 - 5)h+3]

h-1 h-2

√ 5 2 2

(15)

Rotation simple

h-1 h-2

X Y

Z h-2

u v

x

h-1 X

Y Z h-2

u

v x

u ≤ x ≤ v

(16)

X, Petite classe 5 X, Petite classe 7

Double rotation

u ≤ v ≤ x ≤ w

x

h-2

h-2

X

V

Z h-2

u

v

w

W

v

w u

X Z

V h-2 W

x

(17)

Données : une partition de l'ensemble {1, ..., K}

• Trouver la classe d'un élément

• Faire l'union de deux classes.

Partitions

Une première solution :

Représenter la partition par un tableau classe tel que classe[i]

soit la classe de l'élément i.

Trouver : O(1) Union : O(n)

(18)

X, Petite classe 5 X, Petite classe 7

Deuxième solution : utilisation d'une forêt.

10

6

8 4

5 9

1

11 7

3

2

Trouver : O(n)

Union : proportionnel à la hauteur de l'arborescence

On représente la forêt par un tableau t tel que t[s] = père de s (si s est une racine, t[s] = s)

(19)

Union pondérée

Règle : Lors de l'union, la racine de l'arbre le moins haut devient fils de la racine de l'arbre le plus haut.

6

10

8 4

5 9

1

11 7

3

2

On part de la partition de {1, ..., K}

en K classes.

1 2 K

(20)

X, Petite classe 5 X, Petite classe 7

Notons ti(x) la taille (= nombre de noeuds) et hi(x) la hauteur du sommet x après la i-ème opération d'union pondérée. On a t0(x) = 1 et h0(x) = 0.

Lemme. On a ti(x) ≥ 2 hi(x) et hn(x) ≤ log2(n + 1).

Preuve.

(a) Si hi(x) = 0, alors ti(x) = 1

(b) à suivre …

x

(21)

Lemme. On a ti(x) ≥ 2 hi(x) et hn(x) ≤ log2(n + 1).

Preuve (suite).

(b) Si hi(x) > 0, soit y un fils de x. On a hi(y) = hi(x) - 1. Si y est devenu un fils de x lors de la j-ième union (j i), on a

tj-1(x) ≥ tj-1(y), d'où tj(y) = tj-1(y) et

tj(x) ≥ 2tj(y). Ensuite, la taille de y ne varie plus, mais celle de x peut croître.

De même, la hauteur de y ne varie plus, donc hi(y) = hj-1(y). Par hypothèse de récurrence, tj-1(y) ≥ 2 hj-1(y), donc

tj(y) = tj-1(y) ≥ 2 hj-1(y) = 2 hi(y) et

tj(x) ≥ tj(x) ≥ 2.tj(y) ≥ 2.2 hi(y) = 2hi(x)

Comme tn(x) ≤ n+1, on a la seconde inégalité.

x y

(22)

X, Petite classe 5 X, Petite classe 7

Corollaire. Une suite de n-1

"unions" et de m "trouver" se réalise en temps O(n + m log n).

(23)

Compression des chemins

On comprime un chemin en faisant de chaque nœud traversé un fils de la racine :

10

8 4

5 9

1

10

8

4 9

5

1

Prop. Une suite de n-1 "unions" et de m "trouver" (m ≥ n) se réalise en temps O(m.α(n,m)), où α est une sorte d'inverse de la fonction d'Ackermann. En pratique, α(n,m)

≤ 2.

Références

Documents relatifs

Ce problème porte sur un critère d'irréductibilité pour les polynômes à coecients ra- tionnels2. Partie 1 : Contenu d'un polynôme à

[r]

De même on montrera que celui de ab est inférieur ou égal à min(k, l) et qu’ici encore on peut avoir égalité ou non... 3) Le but de cette question est de montrer que si a et b

[r]

[r]

On suppose qu’ils commutent i.e. Montrer que A est un anneau non commutatif et trouver deux ´ el´ ements de A nilpotents dont la somme et le produit ne sont pas nilpotents... 5)

Si le facteur de remplissage augmente trop, suite a de nombreuses insertions, on doit reconstruire la table de hachage avec un nouveau tableau support de longueur plus grande, ce

La corrélation entre deux variables qui sont dans le même groupe soit positive.. La corrélation entre deux variables qui ne sont pas dans le même