pedigree d'un cheval Zoe ; son père est Tonnerre et sa mère Belle ; mère de Belle est Rose et père de Belle est Eclair jean jean marc paul luc



Documents pareils
Les structures de données. Rajae El Ouazzani

Arbres binaires de recherche

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

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

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

ARBRES BINAIRES DE RECHERCHE

INF601 : Algorithme et Structure de données

Les arbres binaires de recherche

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

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

Algorithmique, Structures de données et langage C

Algorithmes de recherche

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

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

Bases de programmation. Cours 5. Structurer les données

Algorithmes récursifs

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

Recherche dans un tableau

chapitre 4 Nombres de Catalan

Domaine Name Service ( DNS )

Programmation Objet - Cours II

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

UEO11 COURS/TD 1. nombres entiers et réels codés en mémoire centrale. Caractères alphabétiques et caractères spéciaux.

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

EXCEL PERFECTIONNEMENT SERVICE INFORMATIQUE. Version /11/05

Architecture des ordinateurs

Conventions d écriture et outils de mise au point

1. Introduction Création d'une requête...2

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

PRODIGE V3. Manuel utilisateurs. Consultation des métadonnées

Université Ibn Zohr Excel Résume de cours

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

Continuité et dérivabilité d une fonction

La mémoire. Un ordinateur. L'octet. Le bit

LibreOffice Calc : introduction aux tableaux croisés dynamiques

Quelques Algorithmes simples

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

Grandes lignes ASTRÉE. Logiciels critiques. Outils de certification classiques. Inspection manuelle. Definition. Test

Analyse hiérarchique de tâches (AHT)

PRODIGE V3. Manuel utilisateurs. Consultation des métadonnées

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

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

DNS : Domaine Name System

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

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

Domain Name Service (DNS)

Note de cours. Introduction à Excel 2007

LE PROBLEME DU PLUS COURT CHEMIN

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

Algorithmes d'apprentissage

LES TYPES DE DONNÉES DU LANGAGE PASCAL

Systemes d'exploitation des ordinateurs

t 100. = 8 ; le pourcentage de réduction est : 8 % 1 t Le pourcentage d'évolution (appelé aussi taux d'évolution) est le nombre :

Automatisation d'une Facture 4. Liste Déroulante Remises Case à cocher Calculs

CH.6 Propriétés des langages non contextuels

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

Protocoles DHCP et DNS

Initiation à l algorithmique

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

Création d'un site dynamique en PHP avec Dreamweaver et MySQL

"! "#$ $ $ ""! %#& """! '& ( ")! )*+

1 Résolution de nom Introduction à la résolution de noms Le système DNS Les types de requêtes DNS...

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

Le modèle de données

Sur un ordinateur exécutant Windows 2000 Server Ayant une adresse IP statique

Cours Programmation Système

Chapitre 1 : Introduction aux bases de données

6 1 ERE PARTIE : LES PRINCIPES DE BASE DE DNS

Rappels sur les suites - Algorithme

Seance 2: En respectant la méthode de programmation par contrat, implémentez les autres fonctions de jeu.

SYSTÈME DE GESTION DE FICHIERS

EXCEL TUTORIEL 2012/2013

Cours admin 200x serveur : DNS et Netbios

Complexité. Licence Informatique - Semestre 2 - Algorithmique et Programmation

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

COUCHE 7/OSI : TRANSFERT DE FICHIERS FTAM

SYSTÈME DE GESTION DE FICHIERS SGF - DISQUE

données en connaissance et en actions?

Logiciel de base. Première année ENSIMAG

Guide d'utilisation du Serveur USB

Le Langage De Description De Données(LDD)

Chapitre 2. Classes et objets

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

A. Définition et formalisme

Représentation d un entier en base b

Bernard HAMM, Évelyne LAVOISIER

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

1. Introduction Création d'une macro autonome Exécuter la macro pas à pas Modifier une macro... 5

Cours 6 : Tubes anonymes et nommés

D'UN THÉORÈME NOUVEAU

RÉALISATION DE GRAPHIQUES AVEC OPENOFFICE.ORG 2.3

Microsoft Excel. Tableur

LA RÉGULARISATION DES CHARGES EN FIN D EXERCICE

1. LA GESTION DES BASES DE DONNEES RELATIONNELLES

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

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

T. A. D. pile. Chapitre 7 (suite) Listes particulières. T. A. D. file. représentation chaînée de la file algorithmique. Files

03/04/2007. Tâche 1 Tâche 2 Tâche 3. Système Unix. Time sharing

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

Transcription:

Chap. 3 Les arbres binaires Un arbre est un ensemble de nœuds, organisés de façon hiérarchique, à partir d'un nœud distingué, appelé racine. La structure d'arbre est l'une des plus importantes et des plus spécifiques de l'informatique: par exemple, c'est sous forme d'arbre que sont organisés les fichiers dans des systèmes d'exploitation tels que UNIX ; c'est aussi sous forme d'arbres que sont représentés les programmes traités par un compilateur Une propriété intrinsèque de la structure d'arbre est la récursivité, et les définitions des caractéristiques des arbres, aussi bien que les algorithmes qui manipulent des arbres s'écrivent très naturellement de manière récursive. 1. Arbres binaires Examinons tout d'abord quelques exemples simples représentés par des arbres binaires : les résultats d'un tournoi de tennis : au premier tour Jean a battu Jules, Marc a battu François, Paul a battu Yves, et Luc a battu Pierre ; au deuxième tour Jean a battu Marc, et Paul a battu Luc ; et Jean a gagné en finale contre Paul. pedigree d'un cheval Zoe ; son père est Tonnerre et sa mère Belle ; mère de Belle est Rose et père de Belle est Eclair jean jean paul jean marc paul luc jean jules françois marc paul yves luc pierre Tonnerre Zoe Belle Eclair Rose une expression arithmétique dans laquelle tous les opérateurs sont binaires 4 + 5 * 8 H. Kassel 1 SDD (2008/2009)

+ 4 * 5 8 La structure d'arbre binaire est utilisée dans très nombreuses applications informatiques ; de plus les arbres binaires permettent de représenter les arbres plus généraux. 1.1 Définition d'un arbre binaire Le vocabulaire concernant les arbres informatiques est souvent emprunté à la botanique ou à la généalogie ; étant donné un arbre B = <o, B1, B2 > : 'o' est la racine de B. B1 est le sous-arbre gauche de la racine de B, (ou, plus simplement, le sous-arbre gauche de B), et B2 est son sous-arbre droit. On dit que C est un sous-arbre de B si, et seulement si : C = B, ou C = B1, ou C = B2, ou C est un sous-arbre de B1 ou de B2. On appelle fils gauche (respectivement fils droit) d'un nœud la racine de son sous-arbre gauche (respectivement sous-arbre droit), et l'on dit qu'il y a un lien gauche (respectivement droit) entre la racine et son fils gauche (respectivement fils droit). Si un nœud n i a pour fils gauche (respectivement droit) un nœud n j, on dit que n i est le père de n j (chaque nœud n'a qu'un seul père). Deux nœuds qui ont le même père sont dits frères. Le nœud n i est un ascendant ou un ancêtre du nœud n j si, et seulement si, n i est le père de n j, ou un ascendant du père de n j ; n i est un descendant de n j si, et seulement si n i est fils de n j, ou n i est un descendant d'un fils de n j. Tous les nœuds d'un arbre binaire ont au plus deux fils : - un nœud qui a deux fils est appelé nœud interne ou point double - un nœud sans fils est appelé nœud externe ou feuille. Donc, un arbre binaire est : - soit vide - soit constitué d'un élément de type T et d'au plus 2 arbres binaires 1.2 Représentation d'un arbre. La représentation la plus naturelle reproduit la définition récursive des arbres binaires. Elle peut être réalisée en allouant la mémoire soit de façon chaînée soit de façon contiguë. Représentation classique d'un arbre est dynamique. A chaque nœud on associe deux pointeurs, l'un vers le sous-arbre gauche, l'autre vers le sousarbre droit, et l'arbre est déterminé par l'adresse de sa racine. Lorsque l'arbre est étiqueté, on représente dans un champ supplémentaire l'information contenue dans le nœud. H. Kassel 2 SDD (2008/2009)

typedef struct arbre T info; struct arbre * sag, *sad arbre typedef arbre *ptr_arbre Si a est un pointeur sur la racine de l'arbre, alors a=null correspond à un arbre vide ; a sag pointe sur le fils gauche de a ; a sad pointe sur le fils droit de a ; a info permet d'accéder au contenu du nœud. On ne parle d'arbres binaires que par l'intermédiaire des algorithmes qui utilisent le type arbre. 1.3 Algorithmes de parcours d'un arbre binaire Parcours en profondeur d'abord : examiner complètement un chemin et passer au chemin suivant tant qu'il en reste j a h l i p Parcours en largeur d'abord : examiner tout un niveau (profondeur hiérarchique) passant au niveau du dessous tant qu'il en reste. a j h l i p Problème : pas de lien entre fils. Cela doit être traité itérativement. H. Kassel 3 SDD (2008/2009)

Parcours en profondeur d'abord a) Préordre Si arbre non vide alors : traiter la racine parcourir en préordre le sag parcourir en préordre le sad Algorithme Donnée : ptr_arbre p void preordre(ptr_arbre a) SI a NULL alors afficher (a info) préordre (a sag) préordre(a sad) Ex. c a b m t y u o On affiche : a c m u t b y o Rq : Il n'y a pas de priorité sur le parcours des sous-arbres. On pourrait commencer par traiter sad avant sag. H. Kassel 4 SDD (2008/2009)

b) Ordre Principe SI arbre est non vide alors : parcourir le sag traiter la racine parcourir le sad Algorithme Donnée : ptr_arbre a void ordre(ptr_arbre a) SI a NULL ALORS ordre(a sag) afficher(a info) ordre(a sad) Rmq : Cet algorithme nous permet d'obtenir les informations dans un ordre total. On peut rentrer les informations dans un arbre binaire de façon triée. Ex. c a b m t y u o On affiche u m c t a y o b Postordre SI arbre n'est pas vide : parcourir en post-ordre le sag parcourir en post-ordre le sad traiter la racine H. Kassel 5 SDD (2008/2009)

c a b m t y u o On affiche u m t c o y b a 2. Arbres binaires de recherche (ABOH arbres binaires ordonnés horizontalement). Définitions et algorithmes de manipulation 2.1. Définition ABOH : Arbre Binaire Ordonné Horizontalement Il est tel que pour tout nœud de l'arbre, les éléments de son sag lui sont inférieurs, de son sad lui sont supérieurs ou égaux. Ex. 30 15 < 50 10 < 35 < 60 5 1 < 6 On a bien l'arbre ordonné horizontalement. Pour un parcours en ordre on obtient 1 5 6 10 15 30 35 50 60 Donc, relation d'ordre totale. Ordre croissant : sag racine sad décroissant : sad racine sag Mais cela dépend de la définition, on peut mettre les plus grands dans le sad ou sag. 2.2 Algorithmes de manipulation a) Ordre donne les éléments en ordre total croissant ou décroissant selon la définition choisie pour ABOH et la priorité de traitement du sag par rapport au sad. b) Recherche d'un élément dans un ABOH Pas de notion de retour arrière, on ne parcourt qu'une branche de l'arbre car on sait s'il est plus grand ou plus petit. Donc, le parcours est naturellement dichotomique. H. Kassel 6 SDD (2008/2009)

Principe SI l'arbre est vide ALORS fin et échec SI l'élément cherché = élément pointé ALORS fin et réussite SI l'élément cherché < élément pointé ALORS rechercher l'élément dans le sag rechercher l'élément dans le sad Algorithme Donnée : ptr_arbre a, T x Résultat de type booléen int recherche(t x, ptr_arbre a) v.l. booléen ok SI a = NULL ALORS ok faux SI a info = x ALORS ok vrai SI a info > x ALORS recherche(x, a sag, ok) recherche(x, a sad, ok) return ok!!! Cet algorithme renvoie la première occurrence du terme cherché, c.à.d. qu'il ne renvoie que la première fois où il rencontre l'élément cherché. Si on recherche la n ième apparition de l'élément dans l'arbre, il faut mettre un compteur. c) Ajout d'un élément dans un ABOH Principe : Placer l'élément dans l'arbre en conservant l'ordre et faisant le moins de réorganisation possible. Un ajout d'élément dans un ABOH se fait systématiquement aux feuilles : 1. SI arbre est vide ALORS création et ajout H. Kassel 7 SDD (2008/2009)

2. SI non vide ALORS trouver la feuille Trouver la feuille : parcourir l'arbre et rechercher la position de l'élément. c.à.d. comparer l'élément à ajouter à la racine : SI racine > élément à ajouter ALORS ajout dans le sag, donc retour en 1) avec le sag. SI racine élément à ajouter ALORS ajout dans le sad, donc retour en 1) avec le sad Ex : 30 NULL NULL On veut ajouter 10 et 50 30 10 50 On veut ajouter 5 et 15 30 On veut ajouter 6 et 12 10 50 5 15 30 10 50 5 15 6 12 Rmq : SI on rajoute 30, il sera le plus petit du sad. Recherche dichotomique de la position. Aucune réorganisation à produire seulement à rajouter un élément. Rmq. En statique, ajouter un élément, c'est rajouter un élément dans le tableau H. Kassel 8 SDD (2008/2009)

Algorithme (en récursif) Donnée : T x Donnée modifiée : ptr_arbre *aa void ajout(t x, ptr_arbre *aa) SI *aa = NULL ALORS reserver(*aa) *aa info x *aa sag NULL *aa sad NULL SI *aa info x ALORS ajout(x, &(*aa sad)) ajout(x, &(*aa sag)) *aa est en Donnée modifiée, donc on gère bien le lien avec la récursivité. Rmq : le mode de transmission par référence crée automatiquement le lien entre le père et le fils Rmq : Ce qui ne marche pas : q *aa sad ajout(x, &q) Dans ce cas le lien est cassé. Ne pas faire!!! d) Suppression d'un élément dans un ABOH 1. L'élément est une feuille Suppression simple : 12 libération mémoire mise à jour du pointeur concerné dans le père 8 15 H. Kassel 9 SDD (2008/2009)

2. L'élément est le père d'un seul sous-arbre mise à jour du pointeur concerné dans le père de l'élément supprimé avec l'adresse du sous-arbre de l'élément supprimé. 4 10 3 3. L'élément à deux sous-arbres 5 9 12 4 8 25 10 14 2 5 11 18 On veut supprimer le 8 Rechercher le plus grand du sag (ou le plus petit du sad) Recopier sa valeur à la place de l'élément à supprimer Supprimer le plus grand du sag (ou le plus petit du sad) par la méthode 1 ou 2 (feuille ou un seul sous-arbre) Principe 1) Si l'arbre est vide, retourner faux 2) Si l'information est plus petite à l'élément, retour en 1) avec le sad 3) Si l'information est plus grande à l'élément, retour en 1) avec le sag 4) Si info = élément (on a trouvé l'élément à supprimer) a) Ni sag, ni sad libération et retour avec vrai b) sad et non sag ou sag et non sad mise à jour du père, libération et retour avec vrai c) sag et sad recherche du plus petit élément dans le sad remplacement d'élément par le plus petit suppression du plus petit avec a) ou b) retour avec vrai Algorithme Donnée : T x Donnée modifiée : ptr_arbre *aa Résultat de type booléen int suppression(t x, ptr_arbre *aa) H. Kassel 10 SDD (2008/2009)

v.l. int ok, ptr_arbre q SI *aa = NULL ALORS ok faux SI *aa info < x ALORS suppression(x, &(*aa sad)) SI *aa info > x ALORS suppression(x, &(*aa sag)) 1221$ /*on a trouvé */ ok vrai SI *aa sag = NULL q *aa *aa *aa sad liberer(q) SI *aa sad = NULL q *aa *aa *aa sag liberer(q)../* à finir */ 2.3 Algorithmes sur l'équilibre des arbres binaires Rmq. Déséquilibre possible d'un ABOH. 6 NULL 12 NULL 18 NULL 24 NULL 30 NULL NULL Si un arbre est déséquilibré, ses performances sont instables. D'où les performances dépendent de la façon d'entrer les informations. La recherche n'est plus dichotomique dans un arbre déséquilibré. Définition d'un arbre équilibré Mesures parfait : Pour tout nœud de l'arbre, la valeur absolue de la différence entre le nombre des nœuds du sad et le nombre des nœuds du sag est inférieure ou égale à 1. H. Kassel 11 SDD (2008/2009)

n g n d 1 ex : parfaitement équilibré n'est pas parfaitement équilibré partiel : Pour tout nœud de l'arbre, la valeur absolue de la différence entre la hauteur du sad et la hauteur du sag est inférieure ou égale à 1. Tous les deux arbres de l exemple précédent sont partiellement équilibrés Il y en a des possibilités permettant d'éviter la construction des arbres déséquilibrés. Par exemple, des arbres AVL. h g h d 1 info balance sag sad balance : -1 : hsag = hsad + 1 0 : hsad=hsag +1 : hasd = hsag + 1 a) Compter - SI l'arbre est vide retourner 0. - compter le nombre de nœuds du sag compter le nombre de nœuds du sad retourner 1 + n sag + n sad Algorithme Donnée ptr_arbre a Résultat de type entier int compter(ptr_arbre a) SI a = NULL ALORS n 0 n 1 + compter(a sag) + compter(a sad) b) Hauteur - SI l'arbre est vide retourner 0. - calculer la hauteur du sag calculer la hauteur du sad H. Kassel 12 SDD (2008/2009)

c) Equilibre parfait SI hg > hd alors retourner 1 + hg retourner 1 + hd - SI l'arbre est vide, il est parfaitement équilibré - compter le nombre de nœuds du sag compter le nombre de nœuds du sad SI ng nd > 1 retourner faux vérifier l'équilibre parfait du sag SI oui vérifier l'équilibre parfait du sad SI oui retourner vrai retourner faux retourner faux H. Kassel 13 SDD (2008/2009)