Arbres AVL Adelson-Velsky et Landis

Documents pareils
Les arbres binaires de recherche

Les structures de données. Rajae El Ouazzani

Arbres binaires de recherche

ARBRES BINAIRES DE RECHERCHE

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

Algorithmique, Structures de données et langage C

Travaux pratiques. Compression en codage de Huffman Organisation d un projet de programmation

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

Instructions pour mettre à jour un HFFv2 v1.x.yy v2.0.00

Recherche dans un tableau

Java Licence Professionnelle CISII,

Projet d informatique M1BI : Compression et décompression de texte. 1 Généralités sur la compression/décompression de texte

Programmer en JAVA. par Tama

TD3: tableaux avancées, première classe et chaînes

Lambda! Rémi Forax Univ Paris-Est Marne-la-Vallée

Olivier Mondet

Surveillance de Scripts LUA et de réception d EVENT. avec LoriotPro Extended & Broadcast Edition

Le prototype de la fonction main()

Serveur d'archivage 2007 Installation et utilisation de la BD exist

Partie I : Créer la base de données. Année universitaire 2008/2009 Master 1 SIIO Projet Introduction au Décisionnel, Oracle

Chapitre 7. Récurrences

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Compression de Données - Algorithme de Huffman Document de Conception

INTRODUCTION AUX SYSTEMES D EXPLOITATION. TD2 Exclusion mutuelle / Sémaphores

Chapitre 10. Les interfaces Comparable et Comparator 1

INF601 : Algorithme et Structure de données

Projet de programmation (IK3) : TP n 1 Correction

Cours Bases de données 2ème année IUT

Problèmes liés à la concurrence

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

Les Triggers SQL. Didier DONSEZ. Université de Valenciennes Institut des Sciences et Techniques de Valenciennes

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

RAPPELS SUR LES METHODES HERITEES DE LA CLASSE RACINE Object ET LEUR SPECIALISATION (i.e. REDEFINITION)

OpenPaaS Le réseau social d'entreprise

Solutions du chapitre 4

Centre CPGE TSI - Safi 2010/2011. Algorithmique et programmation :

Licence de MIDO - 3ème année Spécialités Informatique et Mathématiques Appliquées

Licence Sciences et Technologies Examen janvier 2010

SUPPORT DE COURS. Dr. Omari Mohammed Maître de Conférences Classe A Université d Adrar Courriel : omarinmt@gmail.com

Généralités. javadoc. Format des commentaires. Format des commentaires. Caractères spéciaux. Insérer du code

Installation de VirtualPOPC-1 sur Ubuntu Server LTS 64bits

Création et Gestion des tables

TP3 : Creation de tables 1 seance

Paginer les données côté serveur, mettre en cache côté client

MIS 102 Initiation à l Informatique

Développement mobile MIDP 2.0 Mobile 3D Graphics API (M3G) JSR 184. Frédéric BERTIN

Quelques Algorithmes simples

Génie Logiciel avec Ada. 4 février 2013

Quelques patterns pour la persistance des objets avec DAO DAO. Principe de base. Utilité des DTOs. Le modèle de conception DTO (Data Transfer Object)

Un ordonnanceur stupide

Programmation C++ (débutant)/instructions for, while et do...while

Programmation avec des objets : Cours 7. Menu du jour

Algorithmique et Programmation, IMA

Définition des Webservices Ordre de paiement par . Version 1.0

Résolution de systèmes linéaires par des méthodes directes

ETUDE DE CAS en UML : GESTION DES COMMANDES DE PIECES FABRIQUEES PAR LA SOCIETE C

Plan Général Prévisionnel (1/2) (non contractuel) Internet et Outils L1/IO S2-IO2 Bases de données: Jointures, Transactions

TD Objets distribués n 3 : Windows XP et Visual Studio.NET. Introduction à.net Remoting

Langage propre à Oracle basé sur ADA. Offre une extension procédurale à SQL

Utilitaires méconnus de StrataFrame

Differential Synchronization

as Architecture des Systèmes d Information

Initiation à l algorithmique

Module BDWEB. Maîtrise d informatique Cours 9 - Xquery. Anne Doucet. anne.doucet@lip6.fr

DG-ADAJ: Une plateforme Desktop Grid

Encryptions, compression et partitionnement des données

Cryptologie. Algorithmes à clé publique. Jean-Marc Robert. Génie logiciel et des TI

PARIS ROISSY CHARLES DE GAULLE

Exercices sur SQL server 2000


Package Java.util Classe générique

Jade. Projet Intelligence Artificielle «Devine à quoi je pense»

Exclusion Mutuelle. Arnaud Labourel Courriel : arnaud.labourel@lif.univ-mrs.fr. Université de Provence. 9 février 2011

Algorithmique & programmation

6 - Le système de gestion de fichiers F. Boyer, UJF-Laboratoire Lig, Fabienne.Boyer@imag.fr

Bases de données avancées

GIGABIT PCI DESKTOP ADAPTER DGE-530T. Quick Installation Guide+ Guide d installation+

Reconstruction de bâtiments en 3D à partir de nuages de points LIDAR

Démonstration d utilisation De NesmaCom

1.6- Génération de nombres aléatoires

LMI 2. Programmation Orientée Objet POO - Cours 9. Said Jabbour. jabbour@cril.univ-artois.fr

Plateforme PAYZEN. Définition de Web-services

Revue d article : Dynamic Replica Placement for Scalable Content Delivery

ISC Système d Information Architecture et Administration d un SGBD Compléments SQL

Plan du cours. Historique du langage Nouveautés de Java 7

Cryptographie. Cours 3/8 - Chiffrement asymétrique

Langage SQL (1) 4 septembre IUT Orléans. Introduction Le langage SQL : données Le langage SQL : requêtes

Guide d'installation rapide TFM-560X YO.13

Maîtriser le menu contextuel dans un OfficeBean

Présentation Windows Azure Hadoop Big Data - BI

1 de 46. Algorithmique. Trouver et Trier. Florent Hivert. Mél : Florent.Hivert@lri.fr Page personnelle : hivert

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

Travaux Pratiques de Commande par ordinateur 1 TRAVAUX PRATIQUES

Pharmed. gestion de pharmacie hospitalière. Installation / déploiement

Architectures haute disponibilité avec MySQL. Olivier Olivier DASINI DASINI - -

Compression Compression par dictionnaires

Transcription:

Arbres équilibrés Arbres AVL Adelson-Velsky et Landis Algorithmique avancée Hervé Blanchon Jérôme Goulian IUT Département Informatique Université Pierre Mendès France Georgy Maximovich Adelson-Velsky (russe, 9-) Yevgeniy Mikhailovich Landis (russe, 9-997) AVL en 9!! Les opérations de recherche, d'insertion et de suppression dans un arbre binaire de recherche se font en moyenne en O(log N) comparaisons, mais dans le pire des cas en O(N)!! Comment éviter cette dégradation au fil des insertions? "! Produire des arbres équilibrés (l'arbre binaire de recherche idéal a ses feuilles sur au plus niveaux), peu importe l ordre d insertion ; "! Rééquilibrer l arbre après chaque insertion ou quand temps libre! (par exemple en créant un nouvel arbre par ajout alterné aux feuilles et à la racine)!! Quel est le coût de cette réorganisation? "! O(N) dans le pire des cas!!! Si le nombre de recherches est bien plus grand que le nombre d insertions, alors cela vaut le coup de toutes façons! mais existe-t-il un moyen de préserver une insertion en log N tout en garantissant une recherche également en log N? "! Oui! Il faut abandonner l idée de produire des arbres parfaitement équilibrés au profit d arbres quasi-équilibrés. AVL : Arbres binaires de recherche (quasi) équilibrés!!un AVL est un ABR particulier "! c est un ABR (quasi) équilibré AVL : Arbres binaires de recherche (quasi) équilibrés!! Définir un AVL en considérant pour chaque nœud n de l arbre A (non vide) "! son facteur d équilibre!! bal(p) vérifie h(a d (p)) - h(a g (p))!!! bal(p) = -, ou + "! sa hauteur!! la hauteur des sous-arbre gauche et droit ne peut différer que de!! : "! Insertion aux feuilles comme dans un ABR "! puis rééquilibrage tout de suite 3

Implémentation des AVL!! Nœud d un arbre AVL private static class AvlNode<AnyType> // Constructors AvlNode( AnyType theelement ) this( theelement, null, null ); AvlNode( AnyType theelement, AvlNode<AnyType> lt, AvlNode<AnyType> rt ) element = theelement; left = lt; right = rt; height = + Math.max(left.height, right.height); AnyType element; // The data in the node AvlNode<AnyType> left; // Left child AvlNode<AnyType> right; // Right child int height; // Height!! Méthode de calcul de la hauteur d un nœud d un arbre AVL!! Lors d une insertion, seuls les nœuds situés entre le point d insertion et la racine peuvent avoir leur hauteur altérée!! Lorsque l on remonte du point d insertion vers la racine en mettant à jour les hauteurs, il se peut que l on se trouve sur un nœud dont les fils violent la contrainte de différence de hauteur "! il faut ré-équilibrer l arbre!! Soit " le nœud dont la hauteur des deux fils diffère de, cela peut se produire dans cas :.! insertion dans le sous-arbre gauche du fils gauche de ".! insertion dans le sous-arbre droit du fils gauche de " /** Return the height of node t, or -, if null. */ private int height( AvlNode<AnyType> t ) return t == null? : t.height; 5!! Illustration des cas &!! Lors d une insertion, seuls les nœuds situés entre le point d insertion et la racine peuvent avoir leur hauteur altérée!! Lorsque l on remonte du point d insertion vers la racine en mettant à jour les hauteurs, il se peut que l on se trouve sur un nœud dont les fils violent la contrainte de différence de hauteur "! il faut ré-équilibrer l arbre!! Soit " le nœud dont la hauteur des deux fils diffère de, cela peut se produire dans cas :.! insertion dans le sous-arbre gauche du fils gauche de ".! insertion dans le sous-arbre droit du fils gauche de " 3.! insertion dans le sous-arbre gauche du fils droit de ".! insertion dans le sous-arbre droit du fils droit de " 7 8

!! Illustration des cas 3 &!! Lors d une insertion, seuls les nœuds situés entre le point d insertion et la racine peuvent avoir leur hauteur altérée!! Lorsque l on remonte du point d insertion vers la racine en mettant à jour les hauteurs, il se peut que l on se trouve sur un nœud dont les fils violent la contrainte de différence de hauteur "! il faut ré-équilibrer l arbre!! Soit " le nœud dont la hauteur des deux fils diffère de, cela peut se produire dans cas :.! insertion dans le sous-arbre gauche du fils gauche de ".! insertion dans le sous-arbre droit du fils gauche de " 3.! insertion dans le sous-arbre gauche du fils droit de ".! insertion dans le sous-arbre droit du fils droit de "!! Les cas et sont symétriques par rapport à ", ainsi que les cas et 3 "! deux familles de cas 9!! Première famille de cas. insertion dans le sous-arbre gauche du fils gauche de!. insertion dans le sous-arbre droit du fils droit de! "! l insertion a lieu à l extérieur (gauche-gauche ou droite-droite)!! on fera une rotation simple Rotation simple (à droite)!! Premier cas (/) [situation.]!! Seconde famille de cas. insertion dans le sous-arbre droit du fils gauche de! 3. insertion dans le sous-arbre gauche du fils droit de! "! l insertion a lieu à l intérieur (droite-gauche ou gauche-droite)!! on fera une rotation double "! Le nœud k viole la contrainte car son sous-arbre gauche est plus haut de deux niveaux que son sous-arbre droit (seule situation à correspondre au cas.) "! L insertion s est faite sur X "! Y ne peut être au même niveau que X sinon il y aurait eu déséquilibre plus tôt "! Y ne peut être au même niveau que Z sinon k serait le premier nœud vers la racine qui était en violation d équilibre

Rotation simple (à droite)!! Premier cas (/) "! On voudrait monter X d un niveau et baisser Z d un niveau "! k devient la racine, X reste son fils gauche "! k devient la racine du sous-arbre droit de k "! Z reste le sous-arbre droit de k "! Y devient le sous-arbre gauche de k Rotation simple (à droite avec le fils gauche) /** * Rotate binary tree node with left child. * For AVL trees, this is a single rotation for case. * Update heights, then return new root. */ private AvlNode<AnyType> rotatewithleftchild( AvlNode<AnyType> k ) AvlNode<AnyType> k = k.left; k.left = k.right; k.right = k; k.height = Math.max( height( k.left ), height( k.right ) ) + ; k.height = Math.max( height( k.left ), k.height ) + ; return k;!! Rotation droite 3 Rotation simple (à gauche)!! Second cas (/) [situation.] "! Même analyse ; même remède Rotation simple (à gauche avec le fils droit) /** * Rotate binary tree node with right child. * For AVL trees, this is a single rotation for case. * Update heights, then return new root. */ private AvlNode<AnyType> rotatewithrightchild( AvlNode<AnyType> k ) AvlNode<AnyType> k = k.right; k.right = k.left; k.left = k; k.height = Math.max( height( k.left ), height( k.right ) ) + ; k.height = Math.max( height( k.right ), k.height ) + ; return k;!! Rotation gauche 5

Rotation double (gauche-droite)!! Premier cas (/3) [situation.] "! La rotation droite ne marche pas! Rotation double (gauche-droite)!! Premier cas (/3) [situation.] "! k3 ne peut pas être conservé comme racine "! l insertion a été faite dans Y ce qui garantit que l arbre n est pas vide, on peut assumer qu il a une racine et deux fils "! Une rotation entre k3 et K ne marche pas (déjà vu) "! k doit donc être la nouvelle racine!! k comme fils gauche et k3 comme fils droit "! Il faut deux rotations 7 8 Rotation double (gauche-droite)!! Premier cas (/3) [situation.] Rotation double (droite-gauche)!! Second cas (/) [situation 3.] "! k ne peut pas être conservé comme racine "! Une rotation entre k et K3 ne marche pas "! k doit donc être la nouvelle racine!! k comme fils gauche et k3 comme fils droit "! Il faut deux rotations /** Double rotate binary tree node: first left child * with its right child; then node k3 with new left child. * For AVL trees, this is a double rotation for case. * Update heights, then return new root. */ private AvlNode<AnyType> doublewithleftchild( AvlNode<AnyType> k3 ) k3.left = rotatewithrightchild( k3.left ); return rotatewithleftchild( k3 ); 9

Rotation double (droite-gauche)!! Second cas (/) [situation 3.] Exemples de rotations Ajouts successifs de, 3,,, 7, 5, dans l arbre vide /** Double rotate binary tree node: first right child * with its left child; then node k with new right child. * For AVL trees, this is a double rotation for case 3. * Update heights, then return new root. */ private AvlNode<AnyType> doublewithrightchild( AvlNode<AnyType> k ) k.right = rotatewithleftchild( k.right ); return rotatewithrightchild( k ); Exemples de rotations (facteur d équilibre) Ajouts successifs de, 3,,, 7, 5, dans l arbre vide Autre exemple () : basé sur la hauteur!! Séquence d insertion: "! 8 3 - [ROTD()] 3 3 [ROTG()] [DROTD(3)] - 3 [DROTG(3)] 3 3 5 7 5 7 7 3

Autre exemple () Autre exemple () 8 8 5 Autre exemple () Autre exemple () 8 8 Rotation simple 7 8

Autre exemple () Autre exemple () 8 8-9 3 Autre exemple () Autre exemple () 8 8-8 8 Rotation simple 3 3

Autre exemple () Autre exemple () 8 8-8 - 8 - - 33 3 Autre exemple () Autre exemple () 8 Voici un exemple où la rotation se fait loin du point d insertion - - - 8-8 - 9 7 Rotation double (droite-gauche) Noeud inséré 35 3

Autre exemple () Voici un exemple où la rotation se fait loin du point d insertion - 8 7 9 /** * Internal method to insert into a subtree. * @param x the item to insert. * @param t the node that roots the subtree. * @return the new root of the subtree. */ private AvlNode<AnyType> insert( AnyType x, AvlNode<AnyType> t ) Après rotation double 37 38 if( t == null ) return new AvlNode<AnyType>( x, null, null ); int compareresult = compare( x, t.element ); if( compareresult < ) t.left = insert( x, t.left ); if( height( t.left ) - height( t.right ) == ) if( compare( x, t.left.element ) < ) t = rotatewithleftchild( t ); else t = doublewithleftchild( t ); else if( compareresult > ) t.right = insert( x, t.right ); if( height( t.right ) - height( t.left ) == ) if( compare( x, t.right.element ) > ) t = rotatewithrightchild( t ); else t = doublewithrightchild( t ); else ; // Duplicate; do nothing t.height = Math.max( height( t.left ), height( t.right ) ) + ; return t;