Les arbres binaires de recherche



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

ARBRES BINAIRES DE RECHERCHE

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

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

Algorithmique I. Algorithmique I p.1/??

Arbres binaires de recherche

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

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

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

INF601 : Algorithme et Structure de données

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

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

Algorithmique, Structures de données et langage C

Conventions d écriture et outils de mise au point

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

Cours de Programmation Impérative: Zones de mémoires et pointeurs

Chapitre 7. Récurrences

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

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

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

Algorithmique et Programmation

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

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

Solutions du chapitre 4

Utilisation d objets : String et ArrayList

Initiation à l algorithmique

Recherche dans un tableau

MIS 102 Initiation à l Informatique

Quelques Algorithmes simples

ASR1 TD7 : Un microprocesseur RISC 16 bits

Java Licence Professionnelle CISII,

Licence Sciences et Technologies Examen janvier 2010

Algorithmique et Programmation, IMA

Baccalauréat S Antilles-Guyane 11 septembre 2014 Corrigé

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

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

Cours 1 : La compilation

Corrigé des exercices sur les références

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

Le prototype de la fonction main()

TP1 : Initiation à l algorithmique (1 séance)

# 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>

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

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

Chapitre 10. Les interfaces Comparable et Comparator 1

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

Assurance Qualité. Cours de génie logiciel. Renaud Marlet. LaBRI / INRIA (d'après A.-M. Hugues) màj 23/04/2007

Brefs rappels sur la pile et le tas (Stack. / Heap) et les pointeurs

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

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

Sujet proposé par Yves M. LEROY. Cet examen se compose d un exercice et de deux problèmes. Ces trois parties sont indépendantes.

Corrigés des premiers exercices sur les classes

TP2 : tableaux dynamiques et listes chaînées

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

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

Probabilités. Rappel : trois exemples. Exemple 2 : On dispose d un dé truqué. On sait que : p(1) = p(2) =1/6 ; p(3) = 1/3 p(4) = p(5) =1/12

STAGE IREM 0- Premiers pas en Python

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)

Cours de Systèmes d Exploitation

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

Cours Programmation Système

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

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

INF2015 Développement de logiciels dans un environnement Agile. Examen intra 20 février :30 à 20:30

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

Projet de programmation (IK3) : TP n 1 Correction

Donner les limites de validité de la relation obtenue.

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

1 Recherche en table par balayage

Programmation avec des objets : Cours 7. Menu du jour

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Corrigé des TD 1 à 5

Cours 1 : Qu est-ce que la programmation?

Sub CalculAnnuite() Const TITRE As String = "Calcul d'annuité de remboursement d'un emprunt"

Architecture des ordinateurs

V- Manipulations de nombres en binaire

Algorithme. Table des matières

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

Un ordonnanceur stupide

Master IMEA 1 Calcul Stochastique et Finance Feuille de T.D. n o 1

Projet L1, S2, 2015: Simulation de fourmis, Soutenance la semaine du 4 mai.

4. Groupement d objets

Le langage C++ est un langage de programmation puissant, polyvalent, on serait presque tenté de dire universel, massivement utilisé dans l'industrie

Calcul matriciel. Définition 1 Une matrice de format (m,n) est un tableau rectangulaire de mn éléments, rangés en m lignes et n colonnes.

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

chapitre 4 Nombres de Catalan

Resolution limit in community detection

Domain Name Service (DNS)

Exercices sur les interfaces

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

Feuille TD n 1 Exercices d algorithmique éléments de correction

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

Programmation Classique en langage C

Architecture des ordinateurs TD1 - Portes logiques et premiers circuits

LOGICIEL DE GESTION DE DOCUMENTS PDF : PROJET INFO 1

données en connaissance et en actions?

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

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

Organigramme / Algorigramme Dossier élève 1 SI

Transcription:

Institut Galilée Année 2010-2011 Algorithmique et arbres L2 TD 6 Les arbres binaires de recherche Type en C des arbres binaires (également utilisé pour les ABR) : typedef struct noeud_s { struct noeud_s * parent; struct noeud_s * gauche; struct noeud_s * droite; element_t e; * ab_t, * abr_t; Exercice 1. Combien y a t il de formes d arbres binaires différents à (respectivement) 1, 2,, 4 nœuds? Les dessiner (sans donner de contenu aux nœuds). Pour n fixé quelconque donner un exemple d arbre binaire de hauteur majorée par logn+1, et un exemple d arbre binaire de hauteur n. Exercice 2. Écrire une fonction Taille(x) prenant un arbre binaire et rendant le nombre de ses éléments. Exercice. Écrire une fonction Hauteur(x) prenant un arbre binaire et rendant sa hauteur, c est à dire le nombre d éléments contenus dans la plus longue branche. Exercice 4. Dans les deux exemples d arbres binaires de recherche de la figure 1 : 1. où peut-on insérer un élément de clé 1? 2. comment peut-on supprimer l élément de clé? 12 18 2 1 2 9 1 19 Figure 1: Deux arbres binaires de recherche Les rotations des arbres binaires sont données dans la figure 2. Elles se lisent comme ceci. Une rotation à droite de centre x consiste en : prendre l élément a de x, le sous-arbre droite E de x, la racine y du sous-arbre gauche de x, l élément b contenu dans y, et C et D les deux sous-arbres gauche et droite de y; remplacer a par b dans x, remplacer le sous-arbre gauche de x par C, et le sous-arbre droite de x par un arbre de racine contenant a (on utilise y pour des raisons d implantation) et dont les sous-arbres gauche et droite sont respectivement D et E. La rotation à gauche de centre x est l opération réciproque. Avec cette manière d écrire les rotations la référence de x à son parent n a pas besoin d être mise à jour. Il est assez standard de trouver une version qui échange la place de x et de y plutôt que d échanger leurs éléments mais nous ne l utilisons pas ici.. Sur le premier exemple de la figure 1, faire : une rotation à droite de centre le nœud de clé ; puis une rotation à gauche de centre le nœud de clé. 1

x x y a rotation_droite(x) b y b E rotation_gauche(x) C a C D Figure 2: Rotations gauche et droite. Dans cette version les éléments a et b sont échangés entre les nœuds x et y mais x garde sa place dans l arbre qui le contient. D E 4. Sur le second exemple de la figure 1, à l aide de rotations dont vous préciserez le sens et le centre, amener le nœud de clé 9 à la racine.. Démontrer que toute rotation préserve la propriété d être un arbre de recherche. 6. Écrire l algorithme de rotation à droite en C. 7. Écrire un algorithme permettant de remonter à la racine n importe quel nœud d un arbre binaire de recherche, à l aide de rotations. Exercice (Insertion / suppression ABR). Former un arbre binaire de recherche en insérant successivement et dans cet ordre les éléments : 10,7,,9,11,,6,4,8 (répondre en représentant l arbre obtenu). Supprimer l élément 7. (répondre en représentant le nouvel arbre. Il y a deux réponses correctes possibles, selon la variante choisie pour l algorithme de suppression, n en donner qu une seule). Exercice 6 (À la fois ABR et tas?). Un tas est nécessairement un arbre binaire quasi-parfait. Est-il toujours possible d organiser un ensemble de n clés (n quelconque) en tas max de manière à ce que cet arbre binaire soit aussi un arbre binaire de recherche? (Justifier par un raisonnement ou un contre-exemple). 2 1, pt 1 min 1, pt 9 min Exercice 7. On peut afficher les éléments d un ABR de taille n en ordre trié en un temps O(n). 1. Expliquer comment et argumenter sur le temps d exécution. 2. Est-cequelapropriétédetaspermetd afficherenordretriéetentempso(n)leséléments d untasdetaillen?argumenter.indication:onpeutplanter (former)untasdenéléments en un temps Θ(n). 2

Corrigé Correction de l exercice 1. Un seul arbre à un nœud, deux à deux nøeuds : Cinq à trois nœuds : Quatorze arbres à quatre nœuds (non dessinés). On peut le calculer en trouvant la récurrence : C n+1 = n C k C n k k=0 Qui donne ici C 4 = C 0 C +C 1 C 2 +C 2 C 1 +C C 1 = +2+2+ =. (nombres de Catalan). Pour n fixé l arbre quasi-parfait à n nœuds est tel que si sa hauteur est h alors : 2 h 1 1 < n 2 h 1 D où h 1 logn < h, donc logn+1 majore h. L arbre peigne est quand à lui exactement de hauteur n. Correction de l exercice 2. int taille(ab_t x) { if (estvide(x)) { return 0; return 1 + taille(gauche(x)), taille(droite(x)); Correction de l exercice. void hauteur(ab_t x) { if (estvide(x)) { return 0; return 1 + max(hauteur(gauche(x)), hauteur(droite(x))); Correction de l exercice 4. L insertion est donnée par les figures et 4. La suppression est donnée par les figures et 6. 1. Figure 7. 2. rotation à gauche de centre, puis rotation à droite de centre.

12 2 1 1 Figure : Un arbre binaire de recherche - corrigé 2 9 18 1 19 1 Figure 4: Un autre arbre binaire de recherche - corrigé. Il faut montrer la préservation de la propriété d arbre de recherche. On se contente de montrer que si l arbre à gauche de la figure est un arbre binaire de recherche alors l arbre à droite en est un,et réciproquement. En effet, pour l arbre qui contient l un de ces deux arbres comme sous-arbre, le fait de remplacer l un par l autre ne fait aucune différence : les deux sous-arbres ont mêmes ensembles d éléments. Pour chacun des deux arbres de la figure on montre qu être un arbre de recherche, sous l hypothèse que C, D et E en sont, est équivalent à la propriété : c C, d D, e E, cle(c) cle(b) cle(d) cle(a) cle(e), ce qui conclue. 4. /* Rotations : x -> a ---rot. droite de centre x--> b <- x / \ / \ b E <--rot. gauche de centre x--- C a / \ / \ C D D E */ void rotation_droite(ab_t x){ element_t tmp; ab_t y; assert(x && x->gauche); y = x->gauche; /* échange des éléments */ tmp = x->e; x->e = y->e; 4

12 1 2 Figure : Un arbre binaire de recherche - corrigé B 1 18 2 9 19 Figure 6: Un autre arbre binaire de recherche - corrigé B y->e = tmp; /* déplacement des sous-arbres */ x->gauche = y->gauche; y->gauche = y->droite; y->droite = x->droite; x->droite = y; /* mise à jour des parents */ (x->gauche)->parent = x; (y->droite)->parent = y; void rotation_gauche(ab_t x){ element_t tmp; ab_t y; assert(x && x->droite); y = x->droite; /* échange des éléments */ tmp = x->e; x->e = y->e; y->e = tmp; /* déplacement des sous-arbres */ x->droite = y->droite; y->droite = y->gauche; y->gauche = x->gauche;

12 2 1 Figure 7: Question.1 - corrigé x->gauche = y; /* mise à jour des parents */ (x->droite)->parent = x; (y->gauche)->parent = y;. Voici l algo en pseudo-code. Fonction Remonter(x) y = Parent(x); si y NULL alors /* y existe, x n est pas la racine */ si x == Gauche(y) alors /* x est fils gauche de y */ RotationDroite (y); sinon /* x est fils droit de y */ RotationGauche (y); /* L élément qui était dans le nœud x est désormais dans le nœud y */ Remonter (y); Et en C : void remonter(abr_t x) { y = x->parent; if (y) { /* x n est pas encore à la racine */ if (x == y->gauche) { rotation_droite(y); else { rotation_gauche(y); /* l élément qui était contenu dans x est maintenant dans y */ remonter(y); Correction de l exercice. Pas de correction. 6

Correction de l exercice 6. Dès que n vaut on est confronté à un problème si a est l élément à la racine de l arbre quasi-parfait et que b est son fils gauche et c sont fils droit alors par la propriété des tas on doit avoir a c et par la propriété des ABR a < c. Impossible. Correction de l exercice 7. On peut le faire avec la fonction de parcours infixe. Cette fonction est appelée une fois sur chaque nœud de l arbre et une fois et chacun de ses appels génère au maximum 2 appels surdes nœudsvides(null)negénérantaucunnouvelappel.ainsiilyaaumaximum nappelsàcette fonction au cours d un parcours (on pourrait être plus précis et trouver 2n+1) et chaque appel se faisant en temps constant (pas de boucle), le temps total du parcours est void parcours_infixe(abr_t x) { if (x) { parcours_infixe(x->gauche); affiche_element(x->e); parcours_infixe(x->droite); Si on pouvait parcourir les éléments d un tas en ordre trié en temps O(n), comme on plante untaseno(n),onauraituntriparcomparaisoneno(n).impossible.leparcoursdutasenordre trié est ainsi nécessairement en Ω(n log n). 7