Université Bordeaux 1, Licence Semestre 3 - Algorithmes et struct...

Documents pareils
Université Bordeaux 1, Licence Semestre 3 - Algorithmes et struct...

Les structures de données. Rajae El Ouazzani

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

Programmation Objet - Cours II

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

Quelques Algorithmes simples

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

Rappels sur les suites - Algorithme

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

ARBRES BINAIRES DE RECHERCHE

4. Les structures de données statiques

LE PROBLEME DU PLUS COURT CHEMIN

Les arbres binaires de recherche

CORRECTION EXERCICES ALGORITHME 1

L exclusion mutuelle distribuée

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

INITIATION A L ALGORITHMIQUE INF 102

C f tracée ci- contre est la représentation graphique d une

Algorithmes d'apprentissage

chapitre 4 Nombres de Catalan

Continuité et dérivabilité d une fonction

Calculateur quantique: factorisation des entiers

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

Algorithmes de recherche

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

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

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

Algorithmes récursifs

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.

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

Chapitre 5 : Flot maximal dans un graphe

INF601 : Algorithme et Structure de données

MIS 102 Initiation à l Informatique

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

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

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

Introduction a l'algorithmique des objets partages. Robert Cori. Antoine Petit. Lifac, ENS Cachan, Cachan Cedex. Resume

Chapitre 1 I:\ Soyez courageux!

2 Grad Info Soir Langage C++ Juin Projet BANQUE

Géométrie Algorithmique Plan du cours

La NP-complétude. Johanne Cohen. PRISM/CNRS, Versailles, France.

Licence Sciences et Technologies Examen janvier 2010

COUCHE 7/OSI : TRANSFERT DE FICHIERS FTAM

Introduction à la théorie des graphes. Solutions des exercices

Document Object Model (DOM)

Développements limités. Notion de développement limité

Recherche dans un tableau

Chapitre 2. Classes et objets

Pourquoi l apprentissage?

FctsAffines.nb 1. Mathématiques, 1-ère année Edition Fonctions affines

Limites finies en un point

Baccalauréat ES/L Amérique du Sud 21 novembre 2013

Chapitre 10. Les interfaces Comparable et Comparator 1

La fonction exponentielle

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Conditions Générales d utilisation de l Application «Screen Mania Magazine»

Structures algébriques

Eteindre. les. lumières MATH EN JEAN Mme BACHOC. Elèves de seconde, première et terminale scientifiques :

NOTATIONS PRÉLIMINAIRES

Programmation Orientée Objet

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

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

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

PROBLEMES D'ORDONNANCEMENT AVEC RESSOURCES

Domain Name System. F. Nolot

Raisonnement par récurrence Suites numériques

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

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

Projet de traitement d'image - SI 381 reconstitution 3D d'intérieur à partir de photographies

FICHE UE Licence/Master Sciences, Technologies, Santé Mention Informatique

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

Calcul de développements de Puiseux et application au calcul du groupe de monodromie d'une courbe algébrique plane

CCP PSI Mathématiques 1 : un corrigé

I. Introduction aux fonctions : les fonctions standards

C++ COURS N 2 : CLASSES, DONNÉES ET FONCTIONS MEMBRES Classes et objets en C++ Membres d'une classe Spécification d'une classe Codage du comportement

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

Salle de technologie

Arbres binaires de recherche

Chp. 4. Minimisation d une fonction d une variable

ALGORITHMIQUE II NOTION DE COMPLEXITE. SMI AlgoII

1 Recherche en table par balayage

1 Année LMD-STSM Algorithmique et Programmation. Série de TD 2

Logique. Plan du chapitre

Objectifs du cours d aujourd hui. Informatique II : Cours d introduction à l informatique et à la programmation objet. Complexité d un problème (2)

Application 1- VBA : Test de comportements d'investissements

Création d'un questionnaire (sondage)

ÉPREUVE COMMUNE DE TIPE Partie D

OPTIMISATION À UNE VARIABLE

Systèmes d information et bases de données (niveau 1)

Baccalauréat ES/L Métropole La Réunion 13 septembre 2013 Corrigé

LES TYPES DE DONNÉES DU LANGAGE PASCAL

Chapitre 1 Régime transitoire dans les systèmes physiques

Exercices de dénombrement

Rapport d activité. Mathieu Souchaud Juin 2007

Routage AODV. Languignon - Mathe - Palancher - Pierdet - Robache. 20 décembre Une implémentation de la RFC3561

Plus courts chemins, programmation dynamique

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

De même, le périmètre P d un cercle de rayon 1 vaut P = 2π (par définition de π). Mais, on peut démontrer (difficilement!) que

A. Définition et formalisme

Transcription:

table des matières Université Bordeaux 1 Licence Semestre 3 - Algorithmes et structures de données 1 Dernière mise à jour effectuée le 23 Octobre 2013 Arbres Arbre et arborescence Arbres binaires Parcours d'un arbre binaire Implémentation d'un arbre binaire Retour sur les arborescences Parcours d'un arbre planaire Implémentation d'une arbre planaire 1. Arbre et arborescence Déition 4.1. Un arbre est un graphe connexe sans cycle. Un sous arbre est un sous graphe d'un arbre. Propriété 4.2. Si un arbre a n sommets alors il a n-1 arêtes. Idée de la démonstration Ceci s'appuie sur les deux propriétés suivantes des graphes connexes. Tout graphe connexe ayant n sommets a au moins n-1 arêtes. Tout graphe connexe ayant n sommet et au moins un cycle a au minimum n arêtes. La taille d'un arbre est le nombre de sommets de l'arbre. Propriété 4.3. Entre deux sommets quelconques d'un arbre, il existe une unique chaîne les reliant. Idée de la démonstration Pour deux sommets quelconques: Il ne peut exister deux chaines différentes les reliant il y aurait un cycle dans l'arbre. Il existe au moins une chaine puisque un arbre est un graphe connexe. Déition 4.4. Une arborescence est déie à partir d'un arbre en choisissant un sommet appelé racine et en orientant les arêtes de sorte qu'il existe un chemin de la racine vers tous les autres sommets. On appele fils d'un sommet s tout sommet s' tel que (s,s') est une arête de l'arbre. On notera qu'une arborescence est un exemple d'ensemble partiellement ordonné (relation d'ordre "fils de"). On appelle feuille de l'arbre un sommet qui n'a pas de successeur. Tout autre sommet est appelé sommet interne. On appelle hauteur d'un sommet de l'arbre la longueur du chemin de la racine à ce sommet. Déition 4.5. Un arbre planaire est déi en ordonnant les arêtes sortantes de chaque sommet. 1 sur 8 23/10/13 19:24

On notera qu'un arbre planaire est un exemple d'ensemble totalement ordonné (relation "est fils ou est frère à droite"). Déition 4.6. Un arbre binaire est un arbre planaire dont chaque sommet a au plus deux fils. Déition 4.7. Un arbre binaire complet est un arbre binaire dont chaque sommet interne a exactement deux fils. Propriété 4.8. Tout sommet x d'un arbre binaire vérifie l'une des deux propriétés suivantes: x est une feuille, x a un sous arbre binaire dit gauche de racine G(x) et un sous arbre binaire droit de racine D(x). Déition 4.9. Un arbre binaire parfait est un arbre binaire complet dans lequel toutes les feuilles sont à la même hauteur dans l'arbre. Théorème 4.10Un arbre binaire de taille n a une hauteur est moyenne log 2 (n). Théorème 4.11 Il existe une bijection qui transforme un arbre planaire ayant n sommet en un arbre binaire complet ayant 2n+1 sommets. 2. Arbres binaires Du fait de ce théorème, on ne considère dans un premier temps que le type arbre binaire que l'on nommera arbrebinaire. Chaque sommet permet d'accéder à deux sommets : le fils gauche et le fils droit. Ce type sera nommé sommet. Chaque sommet permet également d'accéder à l'objet qu'il stocke. Un arbre binaire peut être vu comme un curseur indiquant le sommet racine. De la même manière un sommet est un curseur. On a donc arbrebinaire=curseur sommet=curseur Le type sommet présente les primitives suivantes : accès fonction getvaleur(val S:sommet):objet /* vaut NULL si le sommet n'existe pas /* fonction filsgauche(val S:sommet):sommet /* vaut NIL si S n'a pas de fils gauche */ fonction filsdroit(val S:sommet):sommet /* vaut NIL si S n'a pas de fils droit */ fonction pere(val S:sommet):sommet /* vaut NIL si S est la racine de l'arbre */ modification fonction setvaleur(ref S:sommetval x:objet):vide /* affecte au sommet S la valeur x */ fonction ajouterfilsgauche(ref S:sommet,val x:objet):vide /* filsgauche(s)==nil doit être vérifié */ fonction ajouterfilsdroit(ref S:sommet,x:objet):vide /* filsdroit(s)==nil doit être vérifié */ fonction supprimerfilsgauche(ref S:sommet):vide /* filsgauche(s) est une feuille */ fonction supprimerfilsdroit(ref S:sommet):vide /* filsdroit(s) est une feuille */ fonction detruiresommet(ref S:sommet):vide /* S est une feuille */ Il faut par ailleurs pouvoir créer la racine d'un arbre on a donc de plus la primitive fonction créerarbrebinaire(val Racine:objet):sommet et bien entendu détruire un arbre fonction detruirearbrebinaire(ref A:arbreBinaire d'objet):vide Détection de feuille fonction estfeuille(val S:sommet):booléen retourner(filsgauche(s)==nil et filsdroit(s)==nil) Construction d'un arbre binaire à partir d'un tableau d'entiers On choisit de remplir l'arbre de haut en bas et de gauche à droite (parcours hiérarchique). fonction remplirtableauarbre(ref T:tableau[1..N] d'entier): arbrebinaire d'entier var A:arbreBinaire d'entier var F: file de sommet 2 sur 8 23/10/13 19:24

var s:sommet var i:entier créerfile(f) A=créerArbreBinaire(T[1]) enfiler(f,a) tmp=2 tantque 2*tmp-1<=N faire pour i=tmp à 2*tmp-1 par pas de 2 faire s=valeur(f) defiler(f) ajouterfilsgauche(s,t[i]) enfiler(filsgauche(s)) ajouterfilsdroit(s,t[i+1]) enfiler(filsdroit(s)) pour tmp=tmp*2 tantque pour i=tmp à N par pas de 2 faire s=valeur(f) defiler(f) ajouterfilsgauche(s,t[i]) ajouterfilsdroit(s,t[i+1]) pour si N mod 2!=0 alors ajouterfilsgauche(valeur(f),t[n]) si detruirefile(f) retourner(a) 3. Parcours d'un arbre binaire Le parcours d'un arbre binaire consiste à donner une liste de sommets dans l'arbre. Le prototype d'algorithme ci-dessous permet d'effectuer les parcours suivant les algorithmes associés aux traitements à partir d'un sommet de l'arbre. fonction parcoursarbrebinaire(val A:arbreBinaire d'objet):vide // Déclarations locales // traitement 1 si estfeuille(a)alors // traitement 2 // traitement 3 si filsgauche(a)!=nil alors // traitement 4 parcoursarbrebinaire(filsgauche(a)) // traitement 5 si // traitement 6 si filsdroit(a)!=nil alors // traitement 7 parcoursarbrebinaire(filsdroit(a)) // traitement 8 si // traitement 9 si // traitement 1O Complexité: si le traitement i a pour complexité c i (n), soit. La complexité intrinsèque de l'algorithme est O(n c(n)).. On distingue quatre parcours qui conditionnent les algorithmes sur les arbres binaires. Le parcours hiérarchique (voir paragraphe précédent) ainsi que les suivants : Parcours préfixe On liste la racine, les sommets du sous arbre gauche, puis les sommets du sous arbre droit. Parcours infixe On liste les sommets du sous arbre gauche, puis la racine puis les sommets du sous arbre droit. Parcours suffixe On liste les sommets du sous arbre gauche, puis les sommets du sous arbre droit puis la racine. Exemple 3 sur 8 23/10/13 19:24

Parcours préfixe :7 5 9 8 4 6 2 Parcours infixe : 9 5 8 7 6 2 4 Parcours suffixe : 9 8 5 2 6 4 7 Affichage des valeurs des sommets pour un parcours donné Soit un arbre étiquetté par des entiers. On considère que l'on dispose de la fonction suivante qui affiche un entier n sur le terminal fonction afficher(val n:entier):vide Affichage dans le parcours préfixe pas de déclarations locales. traitement 2, 3 : afficher(valeur(a)) Affichage dans le parcours infixe Parcours suffixe pas de déclarations locales. traitement 2, 6: afficher(valeur(a)) pas de déclarations locales. traitement 2, 9 : afficher(valeur(a)) Lister les étiquettes d'un arbre dans un tableau fonction arbre2tableau(val A:arbreBinaire d'entierref T:tableau[1..N] d'entierref i:entier):vide i=i+1 T[i]=valeur(A) si!estfeuille(a)alors si filsgauche(a)!=nil alors arbre2tableau(filsgauche(a),t,i) si si filsdroit(a)!=nil alors arbre2tableau(filsdroit(a),t,i) si si Hauteur d'un arbre binaire fonction hauteurarbrebinaire(val s:sommet):entier si estfeuille(s)alors retourner(0) var tmp1,tmp2:entier tmp1=0 tmp2=0 si filsgauche(s)!=nil alors tmp1= hauteurarbrebinaire(filsgauche(s)) si si filsdroit(s)!=nil alors tmp2=hauteurarbrebinaire(filsdroit(s)) si retourner(1+max(tmp1,tmp2)) si Autre version fonction hauteurarbrebinairesimp(val s:sommet):entier si s==nilalors 4 sur 8 23/10/13 19:24

retourner(-1) retourner(1+max(hauteurarbrebinairesimp(filsgauche(s)),hauteurarbrebinairesimp(filsdroit(s)))) si Remarque : La fonction hauteurarbresimp (même si elle est plus courte) a une complexité plus grande que la fonction hauteurarbrebinaire notamment en nombre d'appel récursif. Elle est moins performante. Taille d'un sous-arbre d'un arbre binaire complet. fonction taillearbrebinaire(val A: arbrebinaire):entier var tmp:entier si estfeuille(a) alors retourner(1) retourner(1+taillearbrebinaire(filsgauche(a)) +taillearbrebinaire(filsdroit(a)) si 4. Implémentation du type arbrebinaire L'implémentation se fait par allocation dynamique. On déit cellule=structure info:objet gauche:sommet droit:sommet pere:sommet structure sommet=^cellule On a alors accès fonction getvaleur(val S:sommet):objet retourner(s^.info) fonction filsgauche(val S:sommet):sommet retourner(s^.gauche) fonction filsdroit(val S:sommet):sommet retourner(s^.droit) fonction pere(val S:sommet):objet retourner(s^.pere) modification fonction créerarbrebinaire(val racine:objet):sommet var tmp:sommet new(tmp) tmp^.info=racine tmp^.gauche=nil tmp^.droit=nil tmp^.pere=nil retourner(tmp) fonction ajouterfilsgauche(ref S:sommet,val x:objet):vide var tmp:sommet new(tmp) tmp^.info=x tmp^.gauche=nil tmp^.droit=nil tmp^.pere=s S^.gauche=tmp fonction ajouterfilsdroit(ref S:sommet,val x:objet):vide var tmp:sommet new(tmp) tmp^.info=x tmp^.gauche=nil tmp^.droit=nil tmp^.pere=s S^.droit=tmp fonction supprimerfilsgauche(ref S:sommet):vide delete(s^.gauche) S^.gauche=NIL 5 sur 8 23/10/13 19:24

fonction supprimerfilsdroit(ref S:sommet):vide delete(s^.droit) S^.droit=NIL fonction detruirearbrebinaire(ref A:arbreBinaire d'objet):vide /* parcours suffixe */ si estfeuille(a)alors delete(a) si filsgauche(a)!=nil alors detruiresarbrebinaire(filsgauche(a)) si si filsdroit(a)!=nil alors detruirearbrebinaire(filsdroit(a)) si delete(a) si 5. Retour sur les arbres planaires On peut déir un type abstrait sommetarbreplanaire par les primitives suivantes: accès fonction getvaleur(val S:sommetArbrePlanaire):objet fonction premierfils(val S:sommetArbrePlanaire):sommetArbrePlanaire fonction frere(val S:sommetArbrePlanaire):sommetArbrePlanaire fonction pere(val S:sommetArbrePlanaire):sommetArbrePlanaire modification fonction créerarbreplanaire(val racine:objet):sommetarbreplanaire fonction ajouterfils(ref S:sommetArbrePlanaire,val x:objet):vide /* ajoute un fils comme cadet */ fonction supprimersommet(ref S:sommetArbrePlanaire):vide /* le sommet doit être une feuille */ fonction detruirearbreplanaire(ref S:sommetArbrePlanaire):vide Un arbre planaire est de type ^sommetarbreplanaire. C'est un curseur. 6. Parcours d'un arbre planaire Le parcours d'un arbre planaire consiste à donner une liste de tous les sommets. Le prototype d'algorithme ci-dessous permet d'effectuer les parcours suivant les algorithmes associés aux traitements à partir d'un sommet de l'arbre planaire. fonction parcoursarbreplanaire(val A:sommetArbrePlanaire):vide // Déclarations locales var f: sommetarbreplanaire // traitement 1 f= premierfils(a) tant que f!=nil faire // traitement 2 parcoursarbreplanaire(f) // traitement 3 f=frere(f) // traitement 4 tantque // traitement 5 On distingue trois parcours qui conditionnent les algorithmes sur les arbres planaires. Le parcours hiérarchique qui s'effectue grâce à une file ainsi que Parcours préfixe On liste la racine, les sommets de chaque sous arbre dans l'ordre où les sous arbres apparaisssent. Parcours suffixe On liste les sommets des sous arbres en ordre inverse puis la racine. Exemple Parcours préfixe : 0 5 8 4 3 10 6 1 7 9 Parcours suffixe : 8 4 5 3 1 6 7 9 10 0 6 sur 8 23/10/13 19:24

Parcours hiérarchique : 0 5 3 10 8 4 6 7 9 1 7. Implémentation du type arbreplanaire Implémentation dans le type arbrebinaire L'implémentation dans le type arbrebinaire découle du théorème 4.11. On a alors arbreplanaire=arbrebinaire. Pour un noeud donné : la primitive filsgauche donne accès au premier fils du noeud. la primitive filsdroit donne accès au frère du noeud. la primitive pere donne accès soit au père du noeud soit à son frère précédent. Il faut donc redéir la primitive pere pour les arbres planaires. fonction perearbreplanaire(val S:sommetArbrePlanaire):sommetArbrePlanaire var T: sommetarbreplanaire T=filsGauche(pere(S)) tant que T!=S faire S=pere(S) T=filsGauche(pere(S)) tantque retourner(pere(s)) En utilisant le théorème 4.10, cette dernière primitive à une complexité moyenne O(log 2 n). Implémentation par allocation dynamique Cette implémentation permet de diminuer le temps d'accès au père. celluleap=structure info:objet premierfils:sommet frère:sommet père:sommet structure Dans cette implémentation, on initialise parfois le champ frere du dernier frère à l'adresse du frère ainé. On peut vérifier aisément que les primitives sont toutes réalisables en O(1). L'espace mémoire est le même que celui occupé par une implémentation dans le type arbrebinaire. accès fonction getvaleur(val s:sommetarbreplanaire):objet retourner(s^.info) fonction premierfils(val s:sommetarbreplanaire):sommetarbreplanaire retourner(s^.premierfils) fonction frere(val S:sommetArbrePlanaire):sommetArbrePlanaire retourner(s^.premierfils) fonction pere(val s:sommetarbreplanaire):sommetarbreplanaire retourner(s^.pere) modification fonction créerarbreplanaire(val racine:objet):sommetarbreplanaire var tmp:^celluleap new(tmp) tmp^.info=racine tmp^.premierfils=nil tmp^.frere=nil tmp^.pere=nil retourner(tmp) fonction ajouterfils(ref s:sommetarbreplanaire,val x:objet):vide /* ajoute un fils comme cadet */ /* cette fonction n'est pas en O(1) */ var tmp:^celluleap new(tmp) tmp^.info=x tmp^.frere=nil tmp^.pere=s si s^.premierfils==nil alors s^.premierfils=tmp r=premierfils(s) tantque frere(r)!=nil faire r=frere(r) tantque 7 sur 8 23/10/13 19:24

r^.frere=tmp fonction supprimersommet(ref s:sommetarbreplanaire):vide /* le sommet doit être une feuille */ var p,r,tmp:^celluleap r=premierfils(pere(s)) si r==s alors p=pere(s) p^.premierfils=s^.frere tantque frere(r)!=s faire r=frere(r) tantque r^.frere=s^.frere si delete(s) fonction detruirearbreplanaire(ref s:sommetarbreplanaire):vide var tmp,f: sommetarbreplanaire f= premierfils(s) tant que f!=nil faire parcoursarbreplanaire(f) f=frere(f) tantque supprimersommet(s) 8 sur 8 23/10/13 19:24