Arbres binaires de recherche



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

Les structures de données. Rajae El Ouazzani

INF601 : Algorithme et Structure de données

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

ARBRES BINAIRES DE RECHERCHE

Les arbres binaires de recherche

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

Algorithmique & programmation

Programmation Par Objets

Recherche dans un tableau

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

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

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

Auto-évaluation Programmation en Java

Programmer en JAVA. par Tama

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

Polymorphisme, la classe Object, les package et la visibilité en Java... 1

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

TP1 : Initiation à Java et Eclipse

Java Licence Professionnelle CISII,

Université de Strasbourg UFR de Mathématique et d'informatique. L2 Informatique Semestres S3 et S4. Structures de Données et Algorithmes 1 et 2

Chapitre 10. Les interfaces Comparable et Comparator 1

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

Programmation avec des objets : Cours 7. Menu du jour

Algorithmique, Structures de données et langage C

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

Corrigé des TD 1 à 5

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

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

Cours 14 Les fichiers

chapitre 4 Nombres de Catalan

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

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

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

LES TYPES DE DONNÉES DU LANGAGE PASCAL

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

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

Classes et Objets en Ocaml.

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

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

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Chap 4: Analyse syntaxique. Prof. M.D. RAHMANI Compilation SMI- S5 2013/14 1

Bernard HAMM, Évelyne LAVOISIER

Application 1- VBA : Test de comportements d'investissements

Algorithmique et Programmation, IMA

NIVEAU D'INTERVENTION DE LA PROGRAMMATION CONCURRENTE

Utilisation de JAVA coté Application serveur couplé avec Oracle Forms Hafed Benteftifa Novembre 2008

Quelques Algorithmes simples

Chapitre VI- La validation de la composition.

Rappel. Analyse de Données Structurées - Cours 12. Un langage avec des déclaration locales. Exemple d'un programme

Développement Logiciel

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

.NET - Classe de Log

Resolution limit in community detection

Conventions d écriture et outils de mise au point

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

Introduction à la programmation concurrente

Conception. Génie Logiciel. Renaud Marlet. LaBRI / INRIA (d'après A.-M. Hugues) màj 17/04/2007

Programmation VBA/Excel. Programmation VBA. Pierre BONNET. Masters SMaRT & GSI - Supervision Industrielle P. Bonnet

L exclusion mutuelle distribuée

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

Un ordonnanceur stupide

Corrigé des exercices sur les références

Algorithmique I. Algorithmique I p.1/??

3. SPÉCIFICATIONS DU LOGICIEL. de l'expression des besoins à la conception. Spécifications fonctionnelles Analyse fonctionnelle et méthodes

as Architecture des Systèmes d Information

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

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

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)

Algorithmes d'apprentissage

Une introduction à Java

Package Java.util Classe générique

Pourquoi l apprentissage?

Machines virtuelles fonctionnelles (suite) Compilation ML Java

Projet de programmation (IK3) : TP n 1 Correction

Cours 1 : La compilation

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

Initiation à l algorithmique

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

Gestion mémoire et Représentation intermédiaire

STAGE IREM 0- Premiers pas en Python

Ensimag 1ère année Algorithmique 1 Examen 2ième session 24 juin Algorithmique 1

Bases de données avancées

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

Design patterns. Design patterns - définition. Design patterns - avantages

Travaux Pratiques de Commande par ordinateur 1 TRAVAUX PRATIQUES

Bases de données Oracle Virtual Private Database (VPD) pour la gestion des utilisateurs d applications

2. Comprendre les définitions de classes

Premiers Pas en Programmation Objet : les Classes et les Objets

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

MISE A NIVEAU INFORMATIQUE LANGAGE C - EXEMPLES DE PROGRAMMES. Université Paris Dauphine IUP Génie Mathématique et Informatique 2 ème année

Dis papa, c est quoi un bus logiciel réparti?

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

Cours de Programmation 2

4. Groupement d objets

Plan. Exemple: Application bancaire. Introduction. OCL Object Constraint Language Le langage de contraintes d'uml

JavaServer Pages (JSP)

Utilisation d objets : String et ArrayList

Transcription:

1

arbre des comparaisons 2 recherche dichotomique l'arbre est recalculé à chaque recherche 2 5 3 4 7 9 1 6 1 2 3 4 5 6 7 9 10 conserver la structure d'arbre au lieu de la reconstruire arbre binaire de recherche: <o, a, b> => max(a) la_clé(o) min(b)

le type arbre-rech 3 type arbre-rech opérations <_, _, _> : nœud arbre-rech arbre-rech / arbre-rech max : arbre-rech / clé min : arbre-rech / clé _ _ : clé arbre-rech booléen préconditions <o, g, d>: (g Ø max(g) la_clé(o)) (d Ø min(d) la_clé(o)) max(a): a Ø utilisation conjointe min (a): a Ø axiome et précondition sémantique max(<o, g, d>) = si d = Ø alors la_clé(o) sinon max(d) fsi min(<o, g, d>) = si g = Ø alors la_clé(o) sinon min(g) fsi c a = si a = Ø alors faux sinon soit a = <o, g, d> ; c = la_clé(o) c g c d fsi

Implantation complète (Ada) 4 generic type Element is private; type Cle is private; with function La_Cle(E: in Element) return Cle is <>; with function "<"(U, V: in Cle) return Boolean is <>; package Arbres_Binaires.De_Recherche is visibilité sur la partie privée du père réutilisation des arbres binaires extension sur le nouveau type type Arbre_Rech is new Arbre with null record; procedure Positionner (L_Arbre: in out Arbre_Rech ; Sur: in Cle); function Contenu_Courant (L_Arbre: in Arbre_Rech) return Element; procedure Changer_Courant (L_Arbre : in out Arbre_Rech; Val : in Element); procedure Ajouter (Dans : in out Arbre_Rech; Val : in Element); private type Noeud_Rech is new Noeud with record Contenu : Element; end record; procedure Ajouter_Feuille(Dans:in out Arbre_Rech;La_Feuille:in Pt_Noeud); end Arbres_Binaires.De_Recherche;

Implantation complète (Java) 5 package bibsdjava.les_types_generiques; public interface Comparable extends Cloneable1 { boolean Inferieur (Object obj) throws Erreur_Typage; } public interface Avec_Cle extends Cloneable1 { Comparable La_Cle (); } package bibsdjava.les_arbres_binaires; class Noeud_Recherche extends Noeud { Avec_Cle Contenu; } public class Arbre_De_Recherche extends Arbre_Binaire { protected Class Type_Element; protected Class Type_Cle; } propriétés attendues sur les valeurs des nœuds extension des nœuds public Arbre_De_Recherche (Avec_Cle Specimen) throws Erreur_Typage {} public void Positionner (Comparable Sur) throws Cle_Inconnue, Limite_Implantation, Erreur_Typage {} public Object Contenu_Courant () throws Erreur_Specification {} extension des opérations

Exemple de recherche 6 Soit à rechercher 12 dans l'arbre suivant chemin 5 12 6 10

Exemple de recherche 7 12 est plus petit que chemin 5 12 6 10

Exemple de recherche 12 est plus grand que chemin 5 12 6 10

Exemple de recherche 9 12 est trouvé chemin 5 12 6 10

Opération de recherche 10 Spécification extension type arbre-rech opérations préconditions recherche : clé arbre-rech / nœud c a sémantique recherche(c, a) = si c = la_clé(racine(a)) alors racine(a) sinsi c < la_clé(racine(a)) alors recherche(c, g(a)) sinon recherche(c, d(a)) fsi complexité: en moyenne PC(a), au pire h(a) utilisation de l'implantation des arbres binaires Note: on construit le chemin jusqu'au nœud cherché implantation : procedure Positionner (L_Arbre : in out Arbre_Rech; Sur : in Cle)

Exemple d'adjonction 11 Soit à ajouter 14 dans l'arbre suivant chemin 5 12 6 10

Exemple d'adjonction 12 14 est plus petit que chemin 5 12 6 10

Exemple d'adjonction 13 14 est plus grand que chemin 5 12 6 10

Exemple d'adjonction 14 14 est plus grand que 12 => repère un arbre vide chemin 5 12 6 10

Exemple d'adjonction remplacement arbre vide par le nœud 14 chemin 5 12 6 10 14

Adjonction d'une feuille (1) 16 appliquer la recherche =>arbre vide remplacé par la feuille extension type arbre-rech opérations préconditions ajouter-f : nœud arbre-rech / arbre-rech (la_clé(o) a) sémantique ajouter-f(o, a) = si a = Ø alors <o, Ø, Ø> sinon soit a = <o', g, d>; si la_clé(o) < la_clé(o') alors <o', ajouter-f(o, g), d> sinon <o', g, ajouter-f(o, d)> fsi fsi 5 12 6 10 14 place

Adjonction d'une feuille (2) 17 procedure Ajouter (Dans : in out Arbre_Rech; Val : in Element) is Cval : Cle := La_Cle (Val); Le_Noeud: Pt_Noeud:= L_Arbre.Chemin(1).Le_Noeud; begin L_Arbre.Sommet := 1; while Le_Noeud /= null recherche and then Cval /= La_Cle (Le_Noeud.Contenu) loop Descendre(L_Arbre, A_Gauche=> Cval < La_Cle(Le_Noeud.Contenu)); Le_Noeud := L_Arbre.Chemin(L_Arbre.Sommet).Le_Noeud; end loop; if Le_Noeud /= null then raise Erreur_Specification; end if; adjonction Raccrocher(Dans, new Noeud_Rech'(Contenu => Val, others => null)); end Ajouter_Feuille; mise au bout du chemin courant complexité: en moyenne PCE(a), au pire h(a)

Exemple d'adjonction à la racine 1 Soit à ajouter 11 à l'arbre suivant reconstruire l'arbre autour du nœud en tant que racine 5 12 6 10

Exemple d'adjonction à la racine 19 est plus grand que 11 donc à droite de 11 tous ceux du sous-arbre droit de sont plus grands que, donc plus grands que 11 ceux qui restent sont plus petits que 11 G D 5 12 6 10

Exemple d'adjonction à la racine 20 est plus petit que 11 tous ceux du sous-arbre gauche de sont plus petits que, donc plus petits que 11 ceux qui restent sont plus petits que et plus grands que 11 5 12 6 10 G D

Exemple d'adjonction à la racine 21 12 est plus grand que 11 (et plus petit que ) ceux de son sous-arbre droit sont plus grands que 12, donc que 11 et plus petits que ceux qui restent sont plus grands que et plus petits que 12 11 10 12 5 6 G D

Exemple d'adjonction à la racine 22 10 est plus petit que 11 (et plus grand que ) ceux de son sous-arbre gauche sont plus petits que 10, donc que 11, et plus grands que ceux qui restent sont plus grands que 10 et plus petits que 12 11 10 5 6 G D 12

Exemple d'adjonction à la racine 23 l'arbre restant est vide: il n'y a pas de valeurs entre et 12, les arbres G et D sont vides. 11 5 10 12 6 G D

Adjonction à la racine (1) 24 Généralisation cas o < r r o b c o b b1 o b2 r c ajout(o, <r, b, c>) = <o, g(ajout(o, b), <r, d(ajout(o, b)), c>>

Adjonction à la racine (2) g1 g o' o spécification axiomatique extension type arbre-rech opérations ajouter-r : nœud arbre-rech / arbre-rech préconditions ajouter-r(o, a): (la_clé(o) a) sémantique g2 o o' d1 ajouter-r(o, a) = si a = Ø alors <o, Ø, Ø> sinon soit a = <o', g, d>; d d2 fsi si la_clé(o) < la_clé(o') alors <o, g(ajouter-r(o, g)), < o', d(ajouter-r(o, g)), d>> sinon <o, <o', g, g(ajouter-r(o, d))>, d(ajouter-r(o, d))> fsi

Adjonction à la racine (3) 26 Implantation récursive procedure Ajouter_Racine (Val : in Element; Racine : in out Pt_Noeud) is Nouveau:Pt_Noeud := new Noeud'(Contenu=>Val,others=>null); procedure Coupure (Courant: in Pt_Noeud; Gauche, Droite : out Pt_Noeud) is begin if Courant = null then Gauche := null; Droite := null; elsif La_Cle (Val) = La_Cle (Courant.Contenu) then raise Erreur_Specification; -- violation précondition elsif La_Cle (Val) < La_Cle (Courant.Contenu) then Droite := Courant; Coupure (Courant.Gauche, Gauche, Courant.Gauche); else Gauche := Courant; Coupure (Courant.Droite, Courant.Droite, Droite); end if; end Coupure; begin Coupure (Racine, Nouveau.Gauche, Nouveau.Droite); Racine := Nouveau; end Ajouter_Racine;

Adjonction à la racine (4) 27 récursivité de coupure n'est pas terminale: procedure Coupure (Courant: in Pt_Noeud; Gauche, Droite : out Pt_Noeud) les arguments Gauche et Droite sont modifiés au retour si l'exception a lieu, les arguments ne sont pas modifiés la pile a une profondeur proportionnelle à la hauteur de l'arbre dérécursification manuelle: modification des pointeurs au fur et à mesure de la descente en cas de levée de l'exception, reconstruire un arbre contenant les mêmes nœuds qu'au départ complexité: en moyenne PCE(a) au pire h(a)

Conclusion sur l'adjonction 2 adjonction comme feuille ou comme racine, donne les mêmes complexités en moyenne PCE(a) au pire h(a) adjonction en feuille: les nœuds les plus anciens sont proches de la racine, et sont retrouvés plus vite adjonction en racine: les nœuds les plus récents sont proches de la racine, et sont retrouvés plus vite

Suppression (1) 29 rechercher le nœud, puis supprimer selon 3 configurations: o' o' o' a o a o a b b b o' o' a o a o" b d o" c b c d

Suppression (2) extension type arbre-rech opérations préconditions gauche : arbre-rech / nœud a Ø sup-gauche : arbre-rech / arbre-rech a Ø supprimer : clé arbre-rech / arbre-rech c a sémantique gauche(<o, g, d>) = si g = Ø alors o sinon gauche(g) fsi sup-gauche(<o, g, d>) = si g = Ø alors d sinon <o, sup-gauche(g), d> fsi supprimer (c, <o, g, d>) = si c < la_clé(o) alors <o, supprimer(c, g), d> sinsi c > la_clé(o) alors <o, g, supprimer(c, d)> sinsi g = Ø alors d sinsi d = Ø alors g sinon <gauche(d), g, sup-gauche(d)> fsi complexité: en moyenne PCE(a) au pire h(a)

Conclusion 31 recherche adjonction et suppression ont une complexité au pire en h(a), avec log 2 n h(a) n - 1 problème: moyenne des profondeurs des arbres de n nœuds lorsqu'on ajoute aléatoirement les nœuds? réponse: 2 Log n complexité moyenne d'ordre logarithmique si on refuse les cas défavorables: arbres H-équilibrés