La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

Cours d’Algorithmique

Présentations similaires


Présentation au sujet: "Cours d’Algorithmique"— Transcription de la présentation:

1 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

2 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

3 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

4 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

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

6 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

7 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

8 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

9 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

10 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

11 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

12 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

13 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

14 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

15 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

16 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

17 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

18 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

19 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

20 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

21 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

22 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

23 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

24 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

25 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

26 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

27 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

28 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

29 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

30 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

31 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

32 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

33 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

34 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

35 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

36 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 : * * + 3 1 5 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique

37 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 : * Impression postfixe de l’arbre : * * + 3 1 5 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique

38 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 : * Impression postfixe de l’arbre : * Impression infixe parenthésée : ( ( ) * 3 ) ( ) * ( + ) 3 1 5 11 février 2014 Cours d'algorithmique 3 - Intranet Cours d'algorithmique

39 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

40 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

41 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

42 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

43 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

44 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

45 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

46 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

47 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

48 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


Télécharger ppt "Cours d’Algorithmique"

Présentations similaires


Annonces Google