Arbres bien équilibrés



Documents pareils
Suivant les langages de programmation, modules plus avancés : modules imbriqués modules paramétrés par des modules (foncteurs)

ARBRES BINAIRES DE RECHERCHE

Les arbres binaires de recherche

Arbres binaires de recherche

Les structures de données. Rajae El Ouazzani

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

# let rec concat l1 l2 = match l1 with [] -> l2 x::l 1 -> x::(concat l 1 l2);; val concat : a list -> a list -> a list = <fun>

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

Quelques Algorithmes simples

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

Chapitre 7. Récurrences

Classes et Objets en Ocaml.

Algorithmique, Structures de données et langage C

INF601 : Algorithme et Structure de données

MIS 102 Initiation à l Informatique

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

Licence Sciences et Technologies Examen janvier 2010

STAGE IREM 0- Premiers pas en Python

Chapitre VI- La validation de la composition.

Cours de Programmation 2

1 Recherche en table par balayage

TP3 : Manipulation et implantation de systèmes de fichiers 1

Algorithmique I. Algorithmique I p.1/??

Recherche dans un tableau

Structure fonctionnelle d un SGBD

Plan du cours : Zippers. Des fonctions sur les listes avec position. Des fonctions sur les listes avec position

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

BIRT (Business Intelligence and Reporting Tools)

introduction Chapitre 5 Récursivité Exemples mathématiques Fonction factorielle ø est un arbre (vide) Images récursives

Définitions. Numéro à préciser. (Durée : )

EXCEL TUTORIEL 2012/2013

Objets et Programmation. origine des langages orientés-objet

Algorithmique et Programmation

Architecture des Systèmes d Information Architecture des Systèmes d Information

Traitement des données avec Microsoft EXCEL 2010

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

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

MapReduce. Malo Jaffré, Pablo Rauzy. 16 avril 2010 ENS. Malo Jaffré, Pablo Rauzy (ENS) MapReduce 16 avril / 15

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

Création d objet imbriqué sous PowerShell.

6. Hachage. Accès aux données d'une table avec un temps constant Utilisation d'une fonction pour le calcul d'adresses

Cours 1 : La compilation

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

Représentation d un entier en base b

Cours d initiation à la programmation en C++ Johann Cuenin

Travaux Dirigés n 1 : chaînes de caractères

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

JADE : Java Agent DEvelopment framework. Laboratoire IBISC & Départ. GEII Université & IUT d Evry nadia.abchiche@ibisc.univ-evry.

Groupe symétrique. Chapitre II. 1 Définitions et généralités

Tp 1 correction. Structures de données (IF2)

Chapitre 10. Les interfaces Comparable et Comparator 1

Correction du baccalauréat S Liban juin 2007

Algorithmes récursifs

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

Machines virtuelles fonctionnelles (suite) Compilation ML Java

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

Programmation avec des objets : Cours 7. Menu du jour

Structures dynamiques Listes chaînées

Excel Avancé. Plan. Outils de résolution. Interactivité dans les feuilles. Outils de simulation. La valeur cible Le solveur

Manuel d utilisation 26 juin Tâche à effectuer : écrire un algorithme 2

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)

Vérification formelle de la plate-forme Java Card

Exercices - Nombres complexes : corrigé. Formes algébriques et trigonométriques, module et argument

L exclusion mutuelle distribuée

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

Exercices types Algorithmique et simulation numérique Oral Mathématiques et algorithmique Banque PT

Évaluation d une architecture de stockage RDF distribuée

Utilisation d objets : String et ArrayList

Analyse de sécurité de logiciels système par typage statique

Module Administration BD Chapitre 1 : Surcouche procédurale dans les SGBDS

#include <stdio.h> #include <stdlib.h> struct cell { int clef; struct cell *suiv; };

Introduction à la sécurité Cours 8 Infrastructure de clés publiques. Catalin Dima

Image d un intervalle par une fonction continue

Cours de C++ François Laroussinie. 2 novembre Dept. d Informatique, ENS de Cachan

Algorithmes d'apprentissage

modules & compilation

Conventions d écriture et outils de mise au point

TP 2 Réseaux. Adresses IP, routage et sous-réseaux

Théorie et Codage de l Information (IF01) exercices Paul Honeine Université de technologie de Troyes France

Vérification de programmes et de preuves Première partie. décrire des algorithmes

V- Manipulations de nombres en binaire

Package Java.util Classe générique

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

Cours de Systèmes d Exploitation

Encapsulation. L'encapsulation consiste à rendre les membres d'un objet plus ou moins visibles pour les autres objets.

Chapitre 3. Mesures stationnaires. et théorèmes de convergence

Une ergonomie intuitive

Objets Combinatoires élementaires

Création et Gestion des tables

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

ELEC2753 Electrotechnique examen du 11/06/2012

Correction Code nécessaire à la compilation : let bs ="\\" let nl = "\n" ;; let appliquer = List.map ;; (* affichage d'un noeud *)

Organiser le disque dur Dossiers Fichiers

Limites finies en un point

Dimensionnement d une roue autonome pour une implantation sur un fauteuil roulant

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

Introduction aux algorithmes répartis

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

Polynômes à plusieurs variables. Résultant

données en connaissance et en actions?

Transcription:

Arbres bien équilibrés ENSIIE : Programmation avancée 1/24

Recherche par dichotomie on aimerait avoir des opérations de recherche, d insertion et de suppression efficaces en moyenne et dans le pire des cas tableau trié mais recherche en O(log n) par dichotomie tri du tableau en O(n log n) insertion et suppression coûteuses (O(n), décalages) ENSIIE : Programmation avancée 2/24

(ABR) Structure de données pour exploiter la recherche par dichotomie Arbre dont les nœuds contiennent des paires (clef, valeur), possédant au plus deux fils. k,v Invariant : pour un nœud les clefs dans le sous-arbre gauche fg sont toutes plus petites que k les clefs dans le sous-arbre droit fd sont toutes plus grandes que k fg et fd vérifie l invariant ENSIIE : Programmation avancée 3/24 fg fd

Preuve par induction Pour montrer que P est vrai pour tout arbre binaire, il suffit de montrer que P est vrai pour l arbre vide x P est vrai pour vrai pour fg et fd fg fd si on suppose que P est Plus approprié qu une récurrence sur la hauteur ou la taille de l arbre ENSIIE : Programmation avancée 4/24

Recherche k,v rechercher k dans fg si k = k, retourner v si k < k et fg est non-vide, rechercher k dans fg si k > k et fd est non-vide, rechercher k dans fd Complexité : O(h) fd à chaque appel récursif, on diminue la hauteur de l arbre d au moins 1 si la bonne clef se trouve au plus bas de l arbre, il faudra h étapes, où h est la hauteur de l arbre ENSIIE : Programmation avancée 5/24

Insertion insérer k,v dans l arbre vide : retourner (k,v ) k,v fg insérer k,v dans fd si k < k, insérer k,v dans fg si k > k, insérer k,v dans fd Complexité : O(h) à chaque appel récursif, on diminue la hauteur de l arbre d au moins 1 on peut avoir à descendre jusqu au nœud le plus bas ENSIIE : Programmation avancée 6/24

Suppression k,v Supprimer k dans fg si fg vide, on retourne fd si fd vide, on retourne fg fd sinon, on recherche l association (k,v ) avec la plus grande clef dans fg (celle la plus à droite) on la met à la place de la racine on supprime k dans fg ENSIIE : Programmation avancée 7/24

Suppression (suite) k,v fg Supprimer k dans fd avec k k : si k < k, supprimer k dans fg si k > k, supprimer k dans fd Complexité : O(h) si la clef à supprimer est dans le nœud le plus à droite, O(h) donc si la clef à supprimer est à la racine, recherche du plus à droite en O(h) et suppression en O(h) O(h) si la clef n est pas à la racine, on fait un appel récursif sur un arbre de hauteur h 1 au maximum O(h) ENSIIE : Programmation avancée 8/24

Complexité dans le pire des cas La hauteur d un arbre à n nœuds est n dans le pire des cas : En particulier, on obtient un arbre de ce type si on insère les éléments par ordre croissant La complexité dans le pire des cas est O(n) pour rechercher, insérer et supprimer ENSIIE : Programmation avancée 9/24

Complexité en moyenne La hauteur moyenne d un arbre à n nœuds est n Toutefois, si on considère les arbres obtenus en insérant les éléments de [0 n 1] suivant toutes les permutations possibles, la hauteur moyenne d un arbre est log n La complexité en moyenne est donc O(log n) pour rechercher, insérer et supprimer ENSIIE : Programmation avancée 10/24

Implémentation (OCaml) type ( k, v) dict = Nil Bin of ( k, v) dict * ( k * v) * ( k, v) dict let creer _ = Nil let rec rechercher d k = match d with Nil -> raise Not_found Bin(_, (k,v), _) when k = k -> v Bin(fg,(k,_), _) when k < k -> rechercher fg k Bin(_, (k,_),fd) -> rechercher fd k ENSIIE : Programmation avancée 11/24

Implémentation (OCaml, suite) let rec inserer d k v = match d with Nil -> Bin(Nil,(k,v),Nil) Bin(_, (k, _), _) when k = k -> failwith "cas non traité" Bin(fg,(k,v ),fd) when k < k -> Bin(inserer fg k v,(k,v ),fd) Bin(fg,(k,v ),fd) -> Bin(fg,(k,v ),inserer fd k v) ENSIIE : Programmation avancée 12/24

Correction (OCaml) rechercher(inserer(d,k,v),k) = v : Pour pouvoir continuer, il faut connaître la forme de d On procède par induction sur d d = Nil : alors inserer d k v = Bin(Nil,(k,v),Nil) rechercher (Bin(Nil,(k,v),Nil)) k = v CQFD ENSIIE : Programmation avancée 13/24

d = Bin(fg, k,fd) Par hypothèse d induction, rechercher(inserer(fg,k,v),k) = v et rechercher(inserer(fd,k,v),k) = v si k < k, inserer d k v = Bin(inserer fg k v, k, fd) rechercher (Bin(inserer fg k v, k, fd)) = rechercher fg k v si k > k, symétrique k k par hypothèse ENSIIE : Programmation avancée 14/24

Implémentation (C) struct dict_base { key key; value val; dict fg; dict fd; }; dict creer(int size) { return NULL; } dict bin(dict fg, key k, value v, dict fd) { dict p = malloc(sizeof(dict_base)); p->key = k; p->val = v; p->fg = fg; p->fd = fd; return p; } ENSIIE : Programmation avancée 15/24

Implémentation (C, suite) value rechercher(dict d, key k) { while(d!= NULL) { if (d->key == k) return d->val; if (d->key > k) d = d->fg; else d = d->fd; }; return NULL; } ENSIIE : Programmation avancée 16/24

Implémentation (C, version destructive) dict inserer(dict d, key k, value v) { if (!d) return bin(null,k,v,null); if (d->key > k) d->fg = inserer(d->fg, k, v); if (d->key < k) d->fd = inserer(d->fd, k, v); return d; } ENSIIE : Programmation avancée 17/24

Implémentation (C, version non destructive) dict inserer(dict d, key k, value v) { dict res; if (!d) res = bin(null,k,v,null); else { if (d->key > k) res = bin(inserer(d->fg, k, v), d->key, d->val, d->fd); if (d->key < k) res = bin(d->fd, d->key, d->val, inserer(d->fg, k, v)); }; return res; } ENSIIE : Programmation avancée 18/24

Arbres AVL Arbres bien équilibrés Pour rendre les ABR efficaces, il faut minimiser la hauteur par rapport au nombre de nœuds Définition Un arbre est bien équilibré si : la différence de hauteur entre ses deux sous-arbres est d au plus 1 chacun de ses sous-arbres est bien équilibré ENSIIE : Programmation avancée 19/24

Arbres AVL Hauteur d un arbre bien équilibré Théorème Pour un arbre bien équilibré à n nœuds et de hauteur h avec α = 1 log 2 ( 1+ 5 2 log 2 (1 + n) h α log 2 (2 + n) ) < 1, 44 Par conséquent, rechercher, insérer et supprimer sont en O(log n) dans les arbres bien équilibrés ENSIIE : Programmation avancée 20/24

Arbres AVL Arbres auto-équilibrants Problème : l insertion et la suppression peuvent déséquilibrer un arbre bien équilibré Modifier les fonctions d insertion et de suppression pour garantir un invariant de bon équilibre Arbres AVL (Adelson-Velskii et Landis, 1962) : rééquilibrage par rotations ENSIIE : Programmation avancée 21/24

Arbres AVL Encapsulation On veut ne manipuler que des arbres bien équilibrés Il faut interdire la création d arbres non équilibrés à l extérieur du module On utilise l encapsulation liée à la modularité : la seule façon de construire des AVL sera via le constructeur intelligent bal Intérêt : dans bal on peut supposer que les arguments sont bien équilibrés, puisqu ils proviennent des appels aux constructeurs intelligents ENSIIE : Programmation avancée 22/24

Arbres AVL Types privés en OCaml type t = private A of u B of v On ne peut utiliser les constructeurs A et B qu à l intérieur du module Toujours possible de filtrer A et B en dehors du module Intérêt : on définit des constructeurs intelligents let a (x : u) = let x =... in A x let b (y : v) = let y =... in B y En dehors du module, obligé de passer par les constructeurs intelligents pour faire un t Toutefois, on peut toujours discriminer les objets de type t ENSIIE : Programmation avancée 23/24

Arbres AVL Complexité Après une insertion, une seule rotation (éventuellement double) est nécessaire Après une suppression, la rotation à effectuer peut entraîner un déséquilibre au-dessus, il y a donc au plus h rotations à effectuer Comme les rotations sont effectuées en temps constant, les opérations pour rééquilibrer l arbre sont en O(log n) Par conséquent, dans un arbre AVL, la recherche, l insertion et la suppression sont en O(log n), y compris dans le pire des cas ENSIIE : Programmation avancée 24/24