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