Cours d’Algorithmique

Slides:



Advertisements
Présentations similaires
Structures de données avancées : Principales structures de données
Advertisements

Présentation générale Marc Gengler

Chapitre 3 Les arbres binaires
Structures de données et complexité
Structures de données et complexité LIFO – FILO – FIFO – etc…
Cours d’Algorithmique
Cours d’Algorithmique
Cours d’Algorithmique
Cours d'algorithmique 10 / Intranet 1 19 décembre 2006 Cours dAlgorithmique Logique de Hoare (fin) : Les boucles et les invariants.
Cours d’Algorithmique
Cours d’Algorithmique
Problème des 4 couleurs, graphes planaires.
Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.
18 octobre 2007Cours de compilation 7 - Intranet1 Cours de compilation Génération de code Optimisation de code.
Cours de graphes Problèmes de flots. Théorème du Max-flow – Min-cut.
Cours d’Algorithmique
Cours d'algorithmique 9 - Intranet 1 12 décembre 2006 Cours dAlgorithmique Logique de Hoare (début) : Principes et constructions élémentaires.
Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.
Cours d'algorithmique 4 - Intranet 1 16 novembre 2006 Cours dAlgorithmique Lalgorithme alpha-beta. Sous-arbres alpha et beta dun arbre minimax et propriétés.
Cours d’Algorithmique
Cours d'algorithmique 11 / Intranet 1 9 janvier 2006 Cours dAlgorithmique N P - complétude.
Cours d'algorithmique 5 - Intranet 1 17/21 novembre 2006 Cours dAlgorithmique Divide and Conquer : principes et applications. Calculabilité.Complexité.
21 septembre 2007Cours de compilation 2 - Intranet1 Cours de compilation Evaluation partielle etcompilation.
Analyse syntaxique (intro)
Cours d'algorithmique 8 - Intranet 1 4 décembre 2006 Cours dAlgorithmique Dérécursion (fin) : Équivalences entre programmes récursifs et programmes itératifs.
Cours d’Algorithmique
24 septembre 2007Cours de compilation 4 - Intranet1 Cours de compilation Techniques danalyse descendantes.
Cours d’Algorithmique
Chap. 1 Structures séquentielles : listes linéaires
Cours d'algorithmique 2 - Intranet 1 8 novembre 2006 Cours dAlgorithmique Listes, piles et files. Arbres. Types de données abstraits. Implantations.
Cours d’Algorithmique
On parle darbre de recherche dune question *Racine de larbre : question *Nœuds : points de choix (formule à démontrer) *Passage dun nœud vers son fils.
ALGORITHMES RECURSIFS
Structures de données linéaires
IPA – Catherine Faron Zucke et Anne Marie Deryr. suite ordonnée d'éléments de taille variable ArrayList liste; liste = new ArrayList (); Ne peuvent contenir.
Les structures de données arborescentes
Arbre binaire de recherche
II. Chaînage, SDD séquentielles
RECURSIVITE ARBRES BINAIRES
8PRO100 Éléments de programmation Allocation dynamique de la mémoire.
Quelques graphes particuliers.
TD4 2 MIC Romaric GUILLERM Algo-Prog en Ada.
Cours de graphes Les arbres et arborescences.
Les arbres binaires.
Cours de graphes Marc Gengler Alexandra Bac Sébastien Fournier
21 février 2006Cours de graphes 2 - Intranet1 Cours de graphes Les plus courts chemins, les chemins les plus légers : à laide de la vague, à laide de la.
Cours de graphes 6 - Intranet
23 février 2007Cours de graphes 4 - Intranet1 Cours de graphes Problèmes de flots. Théorème du Max-flow – Min-cut. Algos de Ford-Fulkerson et Edmonds-Karp.
Exposé en structures de données
IFT-2000: Structures de données Piles et files Dominic Genest, 2009.
IV. Arbres  Arbre binaire (AB) Représentation SDD d’un AB
Structures de données IFT-2000 Abder Alikacem La récursivité Semaine 5 Département dinformatique et de génie logiciel Édition Septembre 2009.
LES ARBRES Un arbre est une structure homogène dont chaque élément,
Structures de données IFT-2000 Abder Alikacem La récursivité Département d’informatique et de génie logiciel Édition Septembre 2009.
L’essentiel du langage C
Le langage C Structures de données
Ch. PAUL - Piles et Files à l'aide de listes chainées
LES PILES ET FILES.
Un survol du language C.
Structures de données élémentaires dans le contexte du TP #1
Arbres binaires et tables de hachage
Chaînage et LSC : motivation et principe Manipuler la LSC : exemples Variantes : LDC, liste circulaire, … Etude de cas : réalisation d’un buffer clavier.
ETNA – 1ème année Guillaume Belmas –
Algorithmique et Conception Objet
Structures de données élémentaires
UE MAREP Cours 10 : Projet Patricia Renault UPMC 2005/2006.
Structures de données IFT-2000 Abder Alikacem Semaine 10 Les algorithmes de recherche Les structures arborescentes Département d’informatique et de génie.
Les arbres Arbres binaires
Informatique 2A Langage C 5ème séance. Déroulement de la séance 5 1 ère partie Étude des chaînes de caractères 2 ème partie Les structures 3.
Transcription de la présentation:

Cours d’Algorithmique Présentation générale Cours d’Algorithmique Arbres. Parcours d’arbres. 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique

Présentation générale Les arbres enracinés ----------------------------------------------------------------- racine Il y a un nœud qui est la  racine . Il y a une orientation de la racine vers les autres. 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique

Présentation générale Les arbres valués ----------------------------------------------------------------- racine Les feuilles sont les extrémités de l’arbre. Du point de vue de l’arbre, elles sont atomiques (sans successeur). Concernant l’application, elles comportent souvent des valeurs. 5 13 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique

Présentation générale Les arbres valués ----------------------------------------------------------------- racine Il y a des nœuds (internes) qui ont des « fils » en nombre variable. Chaque fils est à son tour un arbre. Concernant l’application, les nœuds peuvent comporter des valeurs, que l’on appelle aussi des étiquettes. + x 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique

Présentation générale Des sous-arbres ----------------------------------------------------------------- racine Sous-arbres ! 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique

Présentation générale L E S A R B R E S S O U S F O R M E D E A . D . T . 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique

Présentation générale Définition des arbres comme ADT ----------------------------------------------------------------- Un arbre est soit, simplement une feuille : racine soit, un nœud (racine) avec un ou plusieurs fils qui sont des arbres (enracinés) à leur tour : arbre arbre arbre Les arbres sont des structures définies récursivement ! 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique

Présentation générale Les arbres enracinés binaires comme ADT ----------------------------------------------------------------- Création d’une feuille : cree_feuille : void -> A cree_feuille : int -> A pour créer une feuille qui comporte une valeur entière, ainsi que valeur_feuille : A -> int Création d’un nœud binaire : cree_arbre : A x A -> A cree_arbre : A x int x A -> A pour créer un nœud qui comporte une étiquette entière, ainsi que : etiquette_arbre : A -> int 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique

Présentation générale Les arbres enracinés binaires comme ADT ----------------------------------------------------------------- Distinction entre feuilles et noeuds : est_feuille : A -> BOOL est_feuille( cree_feuille( ) ) = Vrai est_feuille( cree_noeud( x , y ) ) = Faux Décomposition d’un nœud binaire : fils_gauche : A -> A fils_droit : A -> A fils_gauche ( cree_arbre ( g , d ) ) = g fils_droit ( cree_arbre ( g , d ) ) = d 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique

Présentation générale Exemple d’arbres enracinés binaires ----------------------------------------------------------------- arbre_un = cree_arbre ( cree_feuille(5) , cree_feuille(7) ); arbre_deux = cree_arbre ( cree_feuille(2) , cree_arbre ( arbre_un , cree_feuille(1) ) ); arbre_trois = cree_arbre ( cree_feuille(3) , cree_feuille(7) ); arbre = cree_arbre ( arbre_deux , arbre_trois ); 2 3 7 5 7 1 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique

Présentation générale L E S A R B R E S E N L A N G A G E C 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique

Présentation générale Les arbres en langage C ----------------------------------------------------------------- Un pointeur sur un arbre est : soit, un pointeur sur une feuille, soit, un pointeur sur un nœud. Il faut donc une structure capable de contenir les deux : les champs d’une feuille, les champs d’un nœud, un indicateur booléen qui distingue les deux cas de figure. Les expressions arithmétiques comme exemple : toute feuille est un entier, chaque nœud comporte un opérateur et deux sous-expressions. 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique

Présentation générale Les arbres en langage C ----------------------------------------------------------------- typedef struct moi_meme {int est_feuille; int valeur; char etiq; struct moi_meme *fg; struct moi_meme *fd; } t_arbre, *t_ptr_arbre; 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique

Présentation générale Les arbres en langage C ----------------------------------------------------------------- int est_feuille (t_ptr_arbre arbre) {return( arbre->est_feuille ); } t_ptr_arbre cree_feuille (int val) {t_ptr_arbre arbre; arbre = (t_ptr_arbre)malloc( sizeof( t_arbre ) ); arbre->est_feuille = 1; arbre->valeur = val; return( arbre ); 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique

Présentation générale Les arbres en langage C ----------------------------------------------------------------- t_ptr_arbre cree_noeud (t_ptr_arbre fg, t_ptr_arbre fd, char sym) {t_ptr_arbre arbre; arbre = (t_ptr_arbre)malloc( sizeof( t_arbre ) ); arbre->est_feuille = 0; arbre->etiq = sym; arbre->fg = fg; arbre->fd = fd; return( arbre ); } 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique

Présentation générale Les arbres en langage C ----------------------------------------------------------------- t_ptr_arbre fils_gauche (t_ptr_arbre arbre) {assert( !est_feuille( arbre ) ); return( arbre->fg ); } t_ptr_arbre fils_droit (t_ptr_arbre arbre) return( arbre->fd ); 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique

Présentation générale L I S T E S A R B R E S E T L E P O I N T E U R N U L L 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique

Présentation générale Listes, arbres et le pointeur NULL ----------------------------------------------------------------- Une liste peut être vide ! Elle sera représentée par le pointeur NULL ! La raison profonde est le fait que l’opération de base est la concaténation, qui est associative et possède la liste vide comme élément neutre ! Nous avons les fonctions suivantes : cree_vide , est_vide , ajout_liste , tete_liste , queue_liste , ... 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique

Présentation générale Listes, arbres et le pointeur NULL ----------------------------------------------------------------- Un arbre n’est jamais NULL ! La raison profonde est le fait que l’opération de base est la construction d’arbre qui n’est pas associative et la question de l’élément neutre ne se pose même pas ! Arbre ( A , Arbre ( B , C ) ) = Arbre ( Arbre ( A , B ) , C ) / Ce n'est pas associatif. A C B C A B 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique

Présentation générale Listes, arbres et le pointeur NULL ----------------------------------------------------------------- Un arbre n’est jamais NULL ! La raison profonde est le fait que l’opération de base est la construction d’arbre qui n’est pas associative et la question de l’élément neutre ne se pose même pas ! Nous avons les fonctions suivantes : cree_feuille , cree_noeud , est_feuille , fils_gauche et fils_droit . Il n'y a ni cree_arbre_vide, ni est_arbre_vide ! 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique

Présentation générale P A R C O U R S D ‘ A R B R E S 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique

Présentation générale Fibonnacci et les arbres ----------------------------------------------------------------- t_ptr_arbre arbre_fibo (int n) {if ( n == 0 ) return( cree_feuille( 0 ) ); else if ( n == 1 ) return( cree_feuille( 1 ) ); return( cree_noeud( arbre_fibo( n-1 ), arbre_fibo( n-2 ) ) ) ; } 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique

Présentation générale Fibonnacci et les arbres ----------------------------------------------------------------- Nous observons aussi que de nombreux calculs sont répétés ! arbre_fibo( 5 ) 5 4 3 1 3 2 2 1 1 1 2 1 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique

Présentation générale L A S O M M E D E S F E U I L L E S D E L ’ A R B R E 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique

Présentation générale Calcul de la somme des feuilles ----------------------------------------------------------------- int somme_arbre_fibo (t_ptr_arbre arbre) {if ( est_feuille(arbre) ) return( valeur_feuille( arbre ) ); else return( somme_arbre_fibo( fils_gauche( arbre ) ) + somme_arbre_fibo( fils_droit( arbre ) ) ) ; } Pour tout entier naturel n : fibonnacci( n ) = somme_arbre_fibo o arbre_fibo ( n ) 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique

Présentation générale Calcul de la somme des feuilles ----------------------------------------------------------------- sommme_arbre_fibo( 5 ) = 5 5 5 3 4 3 2 1 2 3 1 2 1 2 1 1 1 1 2 1 1 1 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique

Présentation générale Calcul de la somme des feuilles ----------------------------------------------------------------- Nous rajoutons un paramètre d’accumulation initialisé à 0 ! int somme_arbre_fibo (ptr_arbre arbre) {return( somme_acc( arbre , 0 ) ) ; } int somme_acc(ptr_arbre arbre , int accumule) {if ( est_feuille( arbre ) ) return( accumule + valeur_feuille( arbre ) ); else return( somme_acc( fils_droit( arbre ) , somme_acc( fils_gauche( arbre ) , accumule ) ) ) ; } La valeur de la feuille est ajoutée à l’accumulateur ! L’accumulateur ainsi enrichi est ensuite passé à la fonction qui explore le fils droit pour y rajouter les valeurs ! 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique

Présentation générale Calcul de la somme des feuilles ----------------------------------------------------------------- somme_arbre_fibo( 5 ) = 5 accumule = 5 5 accumule = 0 4 3 1 3 2 2 1 1 1 2 . . . 1 2 Tout se passe comme si les feuilles étaient rangées dans un tableau ou une liste ! 1 1 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique

Présentation générale P A R C O U R S E N P R O F O N D E U R P R E F I X E 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique

Présentation générale Types de parcours ----------------------------------------------------------------- Parcours en profondeur et préfixe ! res_fg = appel ( fg(a) ); res_fd = appel ( fd(a) ); return( ... res_fg ... res_fd ... ); 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique

Présentation générale P A R C O U R S E N P R O F O N D E U R S U F F I X E 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique

Présentation générale Types de parcours ----------------------------------------------------------------- Parcours en profondeur et suffixe ( postfixe ) ! Nous parcourons d’abord le fils droit et ensuite le fils gauche ! res_fd = appel ( fd(a) ); res_fg = appel ( fg(a) ); return( ... res_fg ... res_fd ... ); 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique

Présentation générale P A R C O U R S E N P R O F O N D E U R 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique

Présentation générale Types de parcours ----------------------------------------------------------------- Parcours avec un opérateur commutatif : L’ordre de parcours est sans importance ! ... oper_commute ( fg(a) , fd(a) ) ... ... oper_commute ( fd(a) , fg(a) ) ... La distinction entre gauche et droite est inutile ! 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique

Présentation générale L E P A R C O U R S E N P R O F O N D E U R A V E C E T I Q U E T T E 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique

Présentation générale Types de parcours avec étiquettes ----------------------------------------------------------------- Traitement de l’étiquette, soit avant , soit après , soit pendant ! Impression préfixe de l’arbre : * + 1 5 3 * + 3 1 5 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique

Présentation générale Types de parcours avec étiquettes ----------------------------------------------------------------- Traitement de l’étiquette, soit avant , soit après , soit pendant ! Impression préfixe de l’arbre : * + 1 5 3 Impression postfixe de l’arbre : 1 5 + 3 * * + 3 1 5 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique

Présentation générale Types de parcours avec étiquettes ----------------------------------------------------------------- Traitement de l’étiquette, soit avant , soit après , soit pendant ! Impression préfixe de l’arbre : * + 1 5 3 Impression postfixe de l’arbre : 1 5 + 3 * Impression infixe parenthésée : ( ( 1 + 5 ) * 3 ) ( ) * ( + ) 3 1 5 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique

Présentation générale P A R C O U R S E N L A R G E U R 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique

Présentation générale Types de parcours ----------------------------------------------------------------- Le parcours en largeur se fait à l’aide d’une file : Le nœud à traiter est au début de la file ! Les nouveaux nœuds à traiter sont insérés en fin de file ! .. .. .. b c d e f Nous retirons la tête de file et insérons ses fils en fin de file ! File : b - c - d - e - f 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique

Présentation générale L E P A R C O U R S E N P R O F O N D E U R E N P S E U D O - C O D E 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique

Présentation générale Nous utiliserons une récursion . . . Types de parcours ----------------------------------------------------------------- Parcours en profondeur se fait à l’aide d’une pile ! Nous empilons la seule racine ! cree_pile_vide(); empile( racine ); while ( ! pile_vide() ) { traiter = top(); depile(); if ( est_feuille( traiter ) ) traite( traiter ); else {empile( fils_droit( traiter ) ); empile( fils_gauche( traiter ) ); } Tantqu’il reste des traitements à faire ... Une feuille est traitée de suite ! Nous empilons les deux fils d’un nœud interne pour traitement ! 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique

Présentation générale L E P A R C O U R S E N L A R G E U R E N P S E U D O - C O D E 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique

Présentation générale Types de parcours ----------------------------------------------------------------- Ce sera à nous de l'écrire . . . Parcours en largeur se fait à l’aide d’une file ! Les seules différences ! cree_file_vide(); enfile( racine ); while ( ! file_vide() ) { traiter = tete(); defile(); if ( est_feuille( traiter ) ) traite( traiter ); else {enfile( fils_droit( traiter ) ); enfile( fils_gauche( traiter ) ); } C’est un parcours en largeur suffixe ! 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique

Présentation générale M O D I F I C A T I O N D ’ U N A R B R E 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique

Présentation générale Modification d’un arbre ----------------------------------------------------------------- En reconstruisant : Partie qui doit être reconstruite. 3 5 7 2 4 6 cree_noeud( fg(arbre) , cree_noeud( fg(fd(arbre)) , cree_noeud( cree_noeud(cree_feuille(4) , cree_feuille(6)) , fd(fd(fd(arbre))) ) ) ) ; 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique

Présentation générale Modification d’un arbre ----------------------------------------------------------------- En modifiant : Le pointeur qui est modifié ! 3 5 7 2 4 6 modifie_fg_noeud( fd(fd(arbre)) , cree_noeud( cree_feuille(4) , cree_feuille(6) ) ) ; 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique

Présentation générale Modification d’un arbre ----------------------------------------------------------------- Attention aux partages de structure avec modifications physiques ! sous_arbre_a = cree_noeud(cree_feuille(3) , cree_feuille(5)); sous_arbre_b = cree_noeud(cree_feuille(3) , cree_feuille(5)); sous_arbre_c = cree_noeud(cree_feuille(3) , cree_feuille(5)); arbre_part = cree_noeud( sous_arbre_a , sous_arbre_a ); arbre_copie = cree_noeud( sous_arbre_b , sous_arbre_c ); modifie_fd_noeud( fg(arbre_part) , 7 ) ; modifie_fd_noeud( fg(arbre_copie) , 7 ) ; Pas pareil ! ! ! Représentations physiques ! 7 7 3 3 3 5 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique