Algorithmique IN102 TD 3



Documents pareils
Les arbres binaires de recherche

chapitre 4 Nombres de Catalan

Arbres binaires de recherche

Les structures de données. Rajae El Ouazzani

Recherche dans un tableau

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

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

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

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

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

LE PROBLEME DU PLUS COURT CHEMIN

Algorithmique, Structures de données et langage C

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

D'UN THÉORÈME NOUVEAU

EXCEL PERFECTIONNEMENT CALCULS AVANCES

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

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

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

Algorithmes de recherche

LibreOffice Calc : introduction aux tableaux croisés dynamiques

Introduction. I Étude rapide du réseau - Apprentissage. II Application à la reconnaissance des notes.

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

Chapitre 7. Récurrences

Quelques Algorithmes simples

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

INF601 : Algorithme et Structure de données

Algorithmes d'apprentissage

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

Algorithmique I. Algorithmique I p.1/??

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

Conventions d écriture et outils de mise au point

Introduction à la programmation Travaux pratiques: séance d introduction INFO0201-1

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

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

PROBLEMES D'ORDONNANCEMENT AVEC RESSOURCES

Raisonnement par récurrence Suites numériques

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

Ordonnancement. N: nains de jardin. X: peinture extérieure. E: électricité T: toit. M: murs. F: fondations CHAPTER 1

Programme Compte bancaire (code)

Cours Programmation Système

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

Réalisabilité et extraction de programmes

Problème : Calcul d'échéanciers de prêt bancaire (15 pt)

et Programmation Objet

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

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


Le Langage De Description De Données(LDD)

Initiation à l algorithmique

Vers l'ordinateur quantique

Suites numériques 3. 1 Convergence et limite d une suite

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

I. Introduction aux fonctions : les fonctions standards

Cours 1 : introduction

MIS 102 Initiation à l Informatique

Raja Bases de données distribuées A Lire - Tutoriel

1. Création d'un état Création d'un état Instantané Colonnes Création d'un état Instantané Tableau... 4

V- Manipulations de nombres en binaire

Compte-rendu de projet de Système de gestion de base de données

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

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

Axiomatique de N, construction de Z

1 Recherche en table par balayage

Cours 02 : Problème général de la programmation linéaire

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

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

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

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

Structures dynamiques Listes chaînées

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

Exercices - Polynômes : corrigé. Opérations sur les polynômes

Cours d Algorithmique et de Langage C v 3.0

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

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

Algorithmique et Programmation

Google Drive, le cloud de Google

Programmation Objet - Cours II

Introduction à l héritage en C++

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Classe ClInfoCGI. Fonctions membres principales. Gestion des erreurs

Image d un intervalle par une fonction continue

MODE D'EMPLOI DE LA CALCULATRICE POUR LES COURTS SÉJOURS DANS L'ESPACE SCHENGEN

Optimisation non linéaire Irène Charon, Olivier Hudry École nationale supérieure des télécommunications

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

Résolution d équations non linéaires

Structures algébriques

Un ordonnanceur stupide

RÉALISATION DE GRAPHIQUES AVEC OPENOFFICE.ORG 2.3

INFO-F-105 Language de programmation I Séance VI

Continuité et dérivabilité d une fonction

CHAPITRE V. Recherche et tri

Plateforme PAYZEN. Définition de Web-services

Resolution limit in community detection

LA RÉGULARISATION DES CHARGES EN FIN D EXERCICE

BADPLUS V5 MANUEL D'UTILISATION. Imports de données joueurs à partir de la base fédérale en ligne Poona. Stéphan KIEFFER - Dominique BOSSERT

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

Transcription:

Algorithmique IN10 TD 16 décembre 005 Exercice 1 Clairement, il existe des arbres de hauteur h à h + 1 éléments : il sut pour cela que leurs n uds internes aient au plus un ls non vide. On a alors un arbre isomorphe à une liste. Exercice Il existe des arbres de hauteur h contenant h+1 1 éléments. Il 'sagit des arbres dont tous les niveaux de profondeur h sont complètement remplis. En eet, on a alors un n ud de profondeur 0, n uds de profondeur 1, 4 n uds de profondeur,..., soit p n uds de profondeur p, ce qui donne un nombre total de n uds égal à : 0 + 1 + +... + h = h+1 1 1 = h+1 1 Exercice Considérons un arbre à n éléments dont les niveaux sont remplis au maximum. La hauteur d'un tel arbre est alors de l'ordre de log (n). Plus précisément, puisque d'après la question précédente n h+1 1, on a h log(n + 1) 1, d'où h log(n + 1) 1 et donc h log(n + 1) Exercice 4 Cette propriété se démontre par récurrence. Notons P n la propriété tout arbre binaire à au plus n éléments dont les n uds ont soit deux ls, soit aucun, a un nombre de n uds internes égal au nombre de feuilles moins un. P 1 est clairement vraie : l'unique arbre à un élément est composé d'une feuille et n'a aucun n ud interne. Supposons P i vraie pour tout i < n. Un arbre à n éléments se compose d'une racine et de deux sousarbres (droit et gauche), à respectivement p et q éléments (1 + p + q = n). Les propriétés P q et P p sont vraies par hypothèse de récurrence : la somme des n uds internes des sous-arbres gauche et droit est donc inférieure de au nombre total de feuilles. La racine est elle aussi un n ud interne, ce qui ramène à 1 cette diérence. On conclut que P n est vraie pour tout n. Exercice 5 La propriété dénissant un arbre binaire s'imposant à chacun des n uds de l'arbre, elle dénit par la même occason chaque sous-arbre comme un arbre binaire de recherche à part entière. Exercice 6 Un parcours inxé imprime le sous-arbre gauche, puis imprime la racine, puis le sous-arbre droit. D'après la propriété dénissant les arbres binaires de recherche on imprime d'abord tout ce qui est plus petit que la racine, puis la racine elle-même puis tout ce qui est plus grand. Cette procédure étant appliquée à chaque niveau de l'arbre, les clés seront imprimées dans l'ordre croissant. Un algorithme de tri consiste donc à insérer tous les éléments à trier dans un arbre binaire de recherche initialement vide, puis à les extraire par un parcours inxe. Exercice 7 La recherche d'une clé dans un arbre binaire de recherche imite la recherche dichotomique : il sut de comparer la clé recherchée avec celle du n ud courant : si ce n'est pas la clé recherchée, il faut poursuivre la recherche récursivement dans le sous-arbre gauche ou droit, selon le résultat de cette comparaison. Un code en pseudo-c, pour un arbre a, serait : recherchearbre(arbre a, int c) { si a est vide alors renvoyer échec si c = clé(a) alors renvoyer info(a) si c < clé(a) alors recherchearbre(filsgauche(a), c) sinon recherchearbre(filsdroit(a), c) 1

La fonction recherchearbre consiste à suivre un chemin descendant dans l'arbre jusqu'au succès ou l'échec qui sera obtenu lorsqu'on arrivera à une feuille. Dans le pire des cas, le nombre d'appels récursifs (ou de comparaisons requises) sera de l'ordre de Θ(h), où h est la hauteur de l'arbre a. Exercice 8 L'opération d'insertion d'une clé consiste à suivre le bon chemin dans l'arbre jusqu'à arriver à une feuille qu'on remplace alors par un nouveau n ud interne pourvu de deux ls vides, void insererarbre(arbre &a, c) { si a est vide alors a = noeud(vide, c, vide) sinon si c clé(a) alors inserer(filsgauche(a), c) sinon insererarbre(filsdroit(a), c) Tout comme pour la recherche, la complexité est linéaire en la profondeur de l'arbre. Exercice 9 6 4 8 1 5 7 1. 11 14 10 1 9 Exercice 10 Dans l'ordre : préxé : 6 4 1 58 7 1 11 10 9 1 14 inxé : 1 4 5 6 7 8 9 10 11 1 1 14 postxé : 1 5 4 7 9 10 1 11 14 1 8 6 Exercice 11 1. Si le n ud à supprimer a deux ls vides, on le remplace par l'arbre vide ;. s'il a un et un seul ls vide, on le remplace par son autre ls ;. sinon, on calcule son successeur dans l'arbre, c'est-à-dire le n ud possédant la plus petite clé plus grande que la sienne : on se rend aisément compte qu'il s'agit du n ud de clé minimale de son ls droit. On remplace alors sa clé par celle de son successeur, que l'on supprime ensuite aisément car il n'a pas de ls gauche (cas ). Sans détailler, on montre que cette opération s'exécute aussi en Θ(h) où h est la hauteur de l'arbre. Exercice 1 Il y a en fait deux possibilités : l'important étant de garantir que le résultat reste un arbre binaire de recherche. On peut obtenir l'un des arbres suivants : 7 4 8. 1 5 7 1... 11 14 10 1 9 ou bien 5 4 8 1 5 7 1... 11 14 10 1 9

Exercice 1 l'unique arbre sans élément est l'arbre vide : C 0 = 1 l'unique arbre à 1 élément est formé d'une racine avec ls gauche et droit vides, donc C 1 = 1 les deux seuls arbres à éléments sont formés d'une racine et d'un élément qui est soit ls droit, soit ls gauche de la racine, donc C = un arbre à éléments est formé d'une racine et d'un sous-arbre gauche à 0, 1 ou éléments ainsi que d'un ls droit à (respectivement), 1 ou 0 éléments. Par conséquent, C = C 0 C +C 1 C 1 +C C 0 = +1+ = 5. de même, C 4 = C 0 C + C 1 C + C C 1 + C C 0 = 5 + + + 5 = 14. Exercice 14 Généralisant le raisonnement tenu précédemment pour C et C 4, on obtient : C n = C p C q Exercice 15 En développant C(x), on obtient : et par conséquent : On déduit de cette relation que : p+q=n 1 C(x) = C n x n C n x n = n 0 n 0 n 0 xc(x) + 1 = 1 + x n 0 ( p+q=n C p C q ) C n+1 x n = n 0 C n x n = C(x) C(x) = 1 ± 1 4x Pour savoir laquelle de ces deux solutions est la bonne, on utilise le fait que C(0) = C 0 = 1. Or lim x 0 + 1+ 1 4x = + alors que lim x 0 1+ 1 4x = 1 = C 0. Donc : n=1 C(x) = 1 1 4x Exercice 16 En utilisant le développement en série formelle de 1 x, on obtient : C(x) = 1 ( ( 1 4x = 1 + ( ) )) n 1 1 1 4 n 4 n x n (n 1) n n=1 + ( ) 1 n 1 + ( ) = x n 1 1 n + 1 = x n n 1 n n + 1 n + 1 En identiant le coecient de x n à C n, on obtient : ( ) 1 n + 1 C n = = n + 1 n + 1 n=0 (n + 1)! (n + 1)(n + 1)!n! = (n)! (n + 1)n!n! = 1 n + 1 x n ( n n Exercice 17 La formule de Stirling permet d'obtenir une valeur approchée de C n quand n devient grand : C n = (n)! (n + 1)n!n! (n)n (e n ) π n (n + 1)e n (n n ) (π n) 4 n n π n 1 4 n n π Exercice 18 Le nombre d'arbres binaires à n éléments dont le sous-arbre gauche est vide est égal au nombre total d'arbres binaires à n 1 éléments. Par conséquent, la probabilité d'avoir un sous-arbre droit ou gauche vide (si n ) est égale à : C n 1 C n = n (n )! n!n! (n + 1) (n 1)!(n 1)! (n)! = n + 1 n 1 1 Un arbre binaire quelconque a donc une chance sur deux d'avoir l'un de ses sous-arbres immédiats qui est vide! )

Exercice 19 Il y a exactement (C n ) arbres à n + 1 éléments ayant des ls droit et gauche comportant exactement n éléments chacun. Par conséquent, la probabilité que cela se produise est égale à : Exercice 0 (C n ) C n+1 1 π 4n n 1 π 4 n+1 (n + 1) = O(n ) #include <iostream> using namespace std; struct noeud { int cle; noeud gauche; noeud droit; ; typedef noeud arbre; // Construit un arbre à partir de la valeur v de la clé de la racine // et des sous arbres droit (sad) et gauche (sag) arbre branche(int v, arbre sag, arbre sad) { arbre nouv = new noeud; nouv cle = v; nouv gauche = sag; nouv droit = sad; return nouv; void erreur(char s) { cerr "Erreur: " s endl; exit(1); // Impression inxée d'un arbre binaire : void imprimeinfixe(arbre a) { if (a == NULL) return; { imprimeinfixe(a gauche); cout a cle " "; imprimeinfixe(a droit); // Recherche de v dans l'arbre binaire de recherche a: bool recherche(int v, arbre a) { if (a == NULL) return false; if (v == a cle) return true; if (v < a cle) return recherche(v, a gauche); return recherche(v, a droit); // Recherche du minimum dans un arbre: int minimum(arbre a) { if (a == NULL) return 1; if (a gauche == NULL) return a cle; return minimum(a gauche); 4

// Recherche du maximum dans un arbre: int maximum (arbre a) { if (a == NULL) return 1; if (a droit == NULL) return a cle; return maximum(a droit); // Comptage du nombre d'éléments contenus dans l'arbre a: int nbnoeuds(arbre a) { if (a == NULL) return 0; return 1 + nbnoeuds(a gauche) + nbnoeuds(a droit); // Mesure de la hauteur de l'arbre a: int hauteur(arbre a) { if (a == NULL) return 1; int hg = hauteur(a gauche); int hd = hauteur(a droit); if (hg > hd) return 1+hg; return 1+hd; // Insertion de v dans l'arbre a: void insertion(int v, arbre &a) { if (a == NULL) a = branche(v,null,null); if (v < a cle) insertion(v, a gauche); insertion(v, a droit); // Suppression de v dans l'arbre a: bool supprime(int v, arbre &a) { if (a == NULL) return false; if (v == a cle) { if (a gauche == NULL) { arbre tmp = a droit; delete a; a = tmp; return true; if (a droit == NULL) { arbre tmp = a gauche; delete a; a = tmp; return true; int val = minimum(a droit); supprime(val, a droit); a cle = val; return true; 5

if (v < a cle) return supprime(v, a gauche); return supprime(v, a droit); // Libération complète de la mémoire occuppée par un arbre: void liberearbre(arbre a) { if (a NULL) { liberearbre(a gauche); liberearbre(a droit); delete a; 6