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

Th_Info_B - 80 M. BENJELLOUN 2003-2004 Arbres Un arbre est soit un arbre atomique (une feuille), soit un noeud et une suite de sous-arbres. racine feuilles.

Présentations similaires


Présentation au sujet: "Th_Info_B - 80 M. BENJELLOUN 2003-2004 Arbres Un arbre est soit un arbre atomique (une feuille), soit un noeud et une suite de sous-arbres. racine feuilles."— Transcription de la présentation:

1 Th_Info_B - 80 M. BENJELLOUN Arbres Un arbre est soit un arbre atomique (une feuille), soit un noeud et une suite de sous-arbres. racine feuilles noeud interne fils droit fils gauche père L'ensemble des noeuds est constitué des nœuds internes et des feuilles

2 Th_Info_B - 81 M. BENJELLOUN Lintérêt de cette organisation est de laisser à lutilisateur le soin de regrouper les fichiers à sa convenance tout en maintenant une structure hiérarchique.

3 Th_Info_B - 82 M. BENJELLOUN Représentation symbolique des arbres Arbre videArbre singletonArbre quelconque Arbre binaire CECI N'EST PAS UN ARBRE deux pères

4 Th_Info_B - 83 M. BENJELLOUN Par définition un arbre est une structure de données constituée dun nœud appelé racine et de sous-arbres fils de la racine. Cest donc une définition récursive. Un nœud peut contenir une ou plusieurs valeurs, et on parlera alors d'arbres étiquetés et de la valeur (ou des valeurs) d'un nœud. racine

5 Th_Info_B - 84 M. BENJELLOUN Les caractéristiques dun arbre sont : La taille de larbre est le nombre total de nœuds. La hauteur ou niveau dun nœud x est le nombre de liens sur lunique chemin allant de la racine à x, notée h(x). La hauteur ou profondeur de larbre A, h(A) = max { h(x) } x racine x

6 Th_Info_B - 85 M. BENJELLOUN La longueur de cheminement de larbre A, LC(A) = h(x) x hauteur d'un nœud dans un arbre de racine r: si x = r h(x) = 0 sinon h(x) = 1 + h(père(x)) La profondeur d'un nœud est la longueur du chemin qui le joint à la racine. La racine est de hauteur 0, ses fils de hauteur 1 et les k autres nœuds de hauteur supérieure à 1.

7 Th_Info_B - 86 M. BENJELLOUN Exemple de mesures profondeur # noeuds # feuilles Taille = 12Nbrf = 5h = 6 LC(A) = h(x) x

8 Th_Info_B - 87 M. BENJELLOUN a b c d e f g La recherche d'une clé d'un côté sera plus lente qu'une recherche de l'autre côté. Arbres binaires a b c d e f g arbre équilibré La différence entre la hauteur du sous-arbre gauche et la hauteur du sous-arbre droit est d'au plus une unité.

9 Th_Info_B - 88 M. BENJELLOUN Arbre binaire typedef struct cellule { int data; struct noeud *fils_gauche; struct noeud *fils_droit; } nœud;

10 Th_Info_B - 89 M. BENJELLOUN Un Arbre est un pointeur sur un nœud, la racine de larbre : typedef nœud *arbre; Un Arbre vide est un pointeur NULL : arbre = NULL; Nouveau : il faut faire une allocation mémoire et placer létiquette. En cas derreur dallocation le pointeur renvoyé est NULL (larbre est vide) : arbre nouveau_binaire(int elt, arbre racine) { racine = (nœud *) malloc(sizeof (nœud )); if (racine != NULL)){ racine data = elt; racine fils_gauche= NULL; racine fils_droit=NULL; } return(racine); } NULL elt

11 Th_Info_B - 90 M. BENJELLOUN Il faut relier un noeud à un ou plusieurs sous arbres. arbre cons_binaire (arbre racine, arbre s_arb_g, arbre s_arb_d) { racine fils_gauche = s_arb_g; racine fils_droit = s_arb_d; return(racine); }

12 Th_Info_B - 91 M. BENJELLOUN Hauteur int HauteurArbre(arbre A) { if(A non vide) return (1 + Max(HauteurArbre(Ag), HauteurArbre(Ad)) ); else return 0; } Complexité : O(n) Nombre noeud int NbrNoeud(arbre A) { if(A non vide) return (1 + NbrNoeud(Ag) + NbrNoeud(Ad) ); else return 0; }

13 Th_Info_B - 92 M. BENJELLOUN Max noeud int MaxNoeud(arbre A) { if(A non vide) return Max(data, MaxNoeud(Ag), MaxNoeud(Ad)); else return 0; } Min noeud int MinNoeud(arbre A) { if(A non vide) return Min(data, MinNoeud (Ag), MinNoeud (Ad)) ; else return 0; }

14 Th_Info_B - 93 M. BENJELLOUN Arbre binaire de recherche ABR Un arbre binaire de recherche est un arbre binaire tel que pour tout nœud x, les nœuds de son sous arbre-gauche sils en existent ont des valeurs inférieures ou égales à celle de x, et les nœuds de son sous arbre-droit des valeurs strictement supérieures. X <=X>X Ce que lon traduit par g(A) racine(A) < d(A). Utilisation importante en Info pour la localisation, +, -, tri …

15 Th_Info_B - 94 M. BENJELLOUN Un arbre binaire est soit vide, noté Ø, soit de la forme où r est la racine et où Ag et Ad sont des arbres binaires. r <= r> r AgAd

16 Th_Info_B - 95 M. BENJELLOUN Exemple darbre binaire de recherche Tout sous-arbre dun ABR est un ABR Ag Ad

17 Th_Info_B - 96 M. BENJELLOUN test si arbre binaire et de recherche bool TestABR(arbre T){ if(T non vide){ if( TestABR(Td) est un ABR && TestABR(Tg) est un ABR) { if((Td pas vide) && (Td data <= T data)) return (probleme) else { if((Tg pas vide) && (Tg data > T data)) return (probleme) else return (OK) } else return (???) } else return (???) } Complexité : O(2n+1) * O(1) = O(n) x <= x> x TgTd racine

18 Th_Info_B - 97 M. BENJELLOUN Parcours en profondeur d'un arbre binaire de recherche On considère lopération de parcours dun arbre binaire qui consiste à examiner systématiquement dans un certain ordre tous les nœuds de larbres pour effectuer un traitement de données.

19 Th_Info_B - 98 M. BENJELLOUN Parcours préfixe : 12, 9, -2, -77, 9, 10, 23, 22, Parcours préfixe Le parcours en profondeur à gauche consiste à partir de la racine et à tourner autour de larbre en allant toujours le plus à gauche possible. void Prefixe(arbre racine) { if (! vide(racine)) { printf(%d\t,racine data); Prefixe(racine fils_gauche); Prefixe(racine fils_droit); } Lister Père Prefixe(Fils_G) Prefixe(Fils_autres)

20 Th_Info_B - 99 M. BENJELLOUN I III II SI ABR Le parcours infixe affiche les éléments dans lordre croissant Parcours infixe infixe : -77, -2, 9, 9, 10, 12, 22, 23, 78 void infixe(arbre racine) { if (! vide(racine)) { infixe(racine fils_gauche); printf(%d\t,racine data); infixe(racine fils_droit); } Infixe(Fils_G) Lister Père Infixe(Fils_autres)

21 Th_Info_B M. BENJELLOUN III II I Parcours Postfixe : - 77, 9, -2, 10, 9, 22, 78, 23, Parcours suffixe ou Postfixe void Postfixe(arbre racine) { if (! vide(racine)) { Postfixe(racine fils_gauche); Postfixe(racine fils_droit); printf(%d\t,racine data); }

22 Th_Info_B M. BENJELLOUN Exemple: Parcours Parcours préfixe : Parcours infixe : Infixe(Fils_G) Lister Père Infixe(Fils_autres) 0, 1, 2, 3, 4, 5, 6 3, 1, 0, 2, 5, 4, 6 Parcours postfixe : 0, 2, 1, 4, 6, 5, 3 Posfixe(Fils_G) Posfixe(Fils_autres) Lister Père 4

23 Th_Info_B M. BENJELLOUN Exemple: Parcours Parcours préfixe : Parcours infixe : Infixe(Fils_G) Lister Père Infixe(Fils_autres) Parcours postfixe : Posfixe(Fils_G) Posfixe(Fils_autres) Lister Père

24 Th_Info_B M. BENJELLOUN rechercher : valeur x dans arbre == Rech(x,arbre) booléen On compare lélément à la valeur de la racine : - si le sous-arbre sélectionné est vide, lélément est absent échec rechercher ( x, ) = faux - si égalité succès x = r rechercher (x, ) = vraie Recherche dun élément Recherche dichotomoque - si la valeur est plus petite, on recommence récursivement dans le sous-arbre gauche ; et réciproquement si la valeur est plus grande dans le sous-arbre droit x ) = rechercher (x, g ) x > r rechercher (x, ) = rechercher (x, d ) Complexité : La complexité au pire est en O ( hauteur de larbre )

25 Th_Info_B M. BENJELLOUN Soit à rechercher 20 dans l'arbre suivant 20 est plus petit que est plus grand que est trouvé

26 Th_Info_B M. BENJELLOUN Adjonction dun élément aux feuilles Ladjonction aux feuilles dun élément se réalise en deux étapes : - étape de recherche pour savoir où insérer le nouvel élément ; - adjonction elle-même. arbre ajout_feuille (arbre A, int e ) { if (A== ) return else if ( e racine(A) ) return else return } La complexité dune adjonction est O ( h(A) ). e

27 Th_Info_B M. BENJELLOUN arbre insert(arbre T, int x) { if(T vide) { //sommet vide T = (struct nœud *) malloc(sizeof(struct nœud)) T data = x T droit = NULL T gauche = NULL }else{//sommet non vide if(T data == x) //ne rien faire !! else { if(x < T data) //inserer ds arbre gauche Tg = insert(Tg, x) else //inserer ds arbre droit Td = insert(Td, x) } return T } NULL x

28 Th_Info_B M. BENJELLOUN ABR réduire la complexité en temps Alors que linsertion dans un tableau nécessite de déterminer sa place, en parcourant le tableau depuis le début (k comparaisons) puis de décaler les (n-k) éléments successeurs pour ménager une place. Donc une complexité en O(n) avec n le nombre déléments du tableau. La complexité dun ajout est O ( h(A) ). mais pas la complexité de la programmation !!!

29 Th_Info_B M. BENJELLOUN soit on remplace le nœud à supprimer par le plus grand élément de son sous-arbre gauche, soit on le remplace par le plus petit élément de son sous-arbre droit. Suppression dun élément arbre supprimer (arbre, valeur) arbre recherche de lélément à supprimer suppression qui dépend de la place de lélément nœud sans filsnœud avec un seul filsnoeud avec deux fils immédiate remplace le nœud par son fils

30 Th_Info_B M. BENJELLOUN arbre suppression ( arbre A, int e ) { if (A== ) // recherche de lélément à supprimer return erreur; if ( e < racine(A) ) return < racine(A), suppression( g(A), e ), d(A) ); else if ( e > racine(A) ) return < racine(A), g(A), suppression( d(A), e ) ); else { // on la trouver donc suppression if est_feuille(A) return ( ); else if (g(A) == ) return d(A); else if (d(A) == ) return g(A); else { // on ajoute lélément le plus à droite du sous-arbre gauche retourner }

31 Th_Info_B M. BENJELLOUN int max_noeud ( arbre A) { // retourne le plus grand élément de larbre A, le plus à droite if ( d(A) == )return racine(A); elsereturn max_noeud(d(A)) ; } // retourne larbre privé de son plus grand élément arbre retire_max ( arbre A ) { if ( d(A) == )return g(A); elsereturn ; } La complexité est O ( h(A) ).

32 Th_Info_B M. BENJELLOUN La structure de tas est un arbre vérifiant les deux propriétés suivantes: Larbre est un arbre binaire parfait La valeur de tout nœud est >= à celle de ses descendants La structure de tas Arbres binaires complets Un arbre binaire est complet si tous les nœuds qui ne sont pas des feuilles ont 2 fils

33 Th_Info_B M. BENJELLOUN Arbres binaires parfaits, ordre hiérarchique Un arbre binaire est parfait si toutes ses feuilles sont situées sur les deux derniers niveaux, lavant dernier étant complet, et les feuilles du dernier sont le plus à gauche possible. Attention ! un arbre binaire parfait nest pas forcément complet. tas

34 Th_Info_B M. BENJELLOUN Tas = arbre binaire parfait partiellement ordonné arbre parfait: – toutes les feuilles sont sur les deux derniers niveaux, – l'avant dernier niveau est complet – les feuilles du dernier niveau sont le plus à gauche possible partiellement ordonné: – tout nœud est plus grand que ses deux fils

35 Th_Info_B M. BENJELLOUN Arbres binaires complets Un arbre binaire est complet si tous les nœuds qui ne sont pas des feuilles ont 2 fils. Tests !! Arbre binaire complet ?

36 Th_Info_B M. BENJELLOUN Arbre binaire complet ? 9 Arbres binaires complets Un arbre binaire est complet si tous les nœuds qui ne sont pas des feuilles ont 2 fils. Tests !!

37 Th_Info_B M. BENJELLOUN Arbres binaires parfaits, ordre hiérarchique Un arbre binaire est parfait si toutes ses feuilles sont situées sur les deux derniers niveaux, lavant dernier étant complet, et les feuilles du dernier sont le plus à gauche possible. Attention ! un arbre binaire parfait nest pas forcément complet Arbre binaire complet ? Arbre binaire parfait? Tests !!

38 Th_Info_B M. BENJELLOUN Exemple de tas Profondeur ou Nbr nœuds Niveau Max = = = 4 h=3 au Max 2 3 = 8 Racine = + gd valeur = 2 h N <= La structure de tas

39 Th_Info_B M. BENJELLOUN Nœud x en i, son père est en i/2 Nœud x en i, son fils gauche en 2*i Nœud x en i, son fils droit en 2*i Exemple de tas Profondeur ou Nbr nœuds Niveau Max = = = 4 3 au Max 2 3 = *2=456 2*3+1= Index 2*Index2*Index + 1 4

40 Th_Info_B M. BENJELLOUN *2=456 2*3+1= Index i tab[i] int pere(i){ return (i/2); } int gauche(i){ return (2 * i); } int droit(i){ return (2 * i + 1); } Relation entre un tas et tableau

41 Th_Info_B M. BENJELLOUN Opérations sur les tas Insertion dun élément dans un tas Nouveau nœud insérer le plus à gauche possible sur le niveau de profondeur le plus élevée. tjr arbre binaire complet mais pas forcement un tas.

42 Th_Info_B M. BENJELLOUN Compléxité : O(h) avec h : hauteur du tas Or la hauteur dun tas de taille n = log 2 n linsertion requiert un temps O(logn) tant que ( y racine ) et ( y > père(y) ) faire échanger y et père(y) Insertion de n éléments O(nlogn)

43 Th_Info_B M. BENJELLOUN void ajouter (int tab[], int ntas, int val ) { // ajoute lélément x au tas de ntas éléments int i; ntas ++ ; i =ntas ; tab[i] = val ; while ( ( i > 1 ) && ( tab[i/2] < tab[i] ) ){ Echanger ( tab[i], tab[i / 2] ); i = i/2 ; } VERIFICATION

44 Th_Info_B M. BENJELLOUN i tab[i] Avant lajout while ( tab[i /2] < tab[i ] ) { Echanger ( tab[i], tab[i / 2] ); i = i/2 ; } tab[i] 10 Echanger i = i/2 i=11/2=5 Echanger i = i/2 i=5/2= tab[i]

45 Th_Info_B M. BENJELLOUN tab[i] 10 i CQFD

46 Th_Info_B M. BENJELLOUN Exce : Construction dun tas tab[i] i tas tas tas

47 Th_Info_B M. BENJELLOUN tab[i] i int i; ntas ++ ; i =ntas ; tab[i] = val ; while ( ( i > 1 ) && ( tab[i/2] < tab[i] ) ){ Echanger ( tab[i], tab[i / 2] ); i = i/2 ; } 8 15 tab[2/2] < tab[2] tab[i] i tab[i]

48 Th_Info_B M. BENJELLOUN tab[i] i int i; ntas ++ ; i =ntas ; tab[i] = val ; while ( ( i > 1 ) && ( tab[i/2] < tab[i] ) ){ Echanger ( tab[i], tab[i / 2] ); i = i/2 ; }

49 Th_Info_B M. BENJELLOUN Suppression dun élément On remplace la valeur du nœud par celle du nœud le plus à droite possible sur le niveau de profondeur le plus élevée, nœud que lon supprime alors, puis permutations. Exp: racine : suppression du premier élément de la file

50 Th_Info_B M. BENJELLOUN

51 Th_Info_B M. BENJELLOUN Tri par tas [Heap sort] Principe : deux phases - Construire un tas contenant les n éléments par adjonction successives ; en O (n log n). - Tant que le tas nest pas vide, répéter l'opération de prendre l'élément de la racine (max), le retirer du tas avec réorganisation, mettre ce max à sa place définitive ; en O (n log n) réorganisation Suppression

52 Th_Info_B M. BENJELLOUN réorganisation Suppression

53 Th_Info_B M. BENJELLOUN trier_tas(A) { construire_tas(A) while( …) { echanger A[1] avec A[taille] supprimer A[taille] taille = taille – 1 reorganisation() }

54 Th_Info_B M. BENJELLOUN Test !!! tab[i] i : construction dun tas 2: ajout de 20

55 Th_Info_B M. BENJELLOUN i Test !!!

56 Th_Info_B M. BENJELLOUN Test !!! 5, 1, 7, 3, 4, 6, 2 Construction dun arbre binaire de recherche (ABR). i r <= r> r AgAd Prefixe, Infixe, Postfixe ??

57 Th_Info_B M. BENJELLOUN Application : Imprimante en réseau JbU5 Tri: Arbre JbUn JbU1 JbUn JbU1 User1 User2 UserN JbUnJbU1 FIFO

58 Th_Info_B M. BENJELLOUN Diviser pour régner Existe-t-il une méthode pour rechercher une récursivité et évaluer a priori sa complexité? On peut couper un problème de taille N en A problèmes identiques Recomposition de ces A problèmes se fait en un temps d'ordre N

59 Th_Info_B M. BENJELLOUN Exemple : TRI par FUSION Pour trier un tableau t de n éléments, on le scinde en deux tableaux de même taille (à un élément près). On les note t1 de taille n1 et t2 de taille n-n1. Ces deux tableaux sont ensuite triés (appel récursif) et enfin fusionnés de manière à reformer le tableau t trié. scinder fusionne r T(N) = 2 * T(N/2) + ordre N d'où T(N) = N log 2 N tableau t

60 Th_Info_B M. BENJELLOUN Quicksort : tri rapide Principe : diviser pour régner On prend un élément au hasard dans le tableau à trier. Soit p (pivot) sa valeur. On partitionne le reste du tableau en 2 zones: les éléments plus petits ou égaux à p, et les éléments plus grands à p. Si on arrive à mettre en tête du tableau les plus petits que p et en fin du tableau les plus grands, on peut mettre p entre les deux zones à sa place définitive. On recommence récursivement la procédure Quicksort sur chacune des partitions tant qu'elles ne sont pas réduites à un élément. A la fin, la liste est triée par ordre croissant. p> pivot pivot g > pivotG pivotG d > pivotD pivotD

61 Th_Info_B M. BENJELLOUN p> pivot pivot void Quicksort ( int tab[], int g, int d ) { // Quicksort ( tab, 0, n ) int k; //position du pivot if( g < d){ Placer (tab, g, d, &k); Quicksort (tab, g, k - 1); Quicksort (tab, k + 1, d); } g d

62 Th_Info_B M. BENJELLOUN p p p p > p p x iL K j j+1 La fonction Placer : La partition et le placement du pivot ne nécessitent quun parcours. On utilise deux compteurs L et K qui partent des extrémités du sous- tableau, et qui vont lun vers lautre : - L part de i+1 et avance tant que lon rencontre un élément à p. - K part de j et recule tant que lon rencontre un élément > à p. On échange les deux éléments et on recommence la progression jusquà ce que les deux compteurs se croisent : la place définitive du pivot est en k, et on y place le pivot p par échange avec un élément à p. complexité en moyenne O (n log n).

63 Th_Info_B M. BENJELLOUN Exemple de tri rapide ij

64 Th_Info_B M. BENJELLOUN Arbres balancés ou B-arbres prendre en compte la taille des blocs disques regrouper les nœuds voisins dans un même bloc Les B_arbres sont des arbres de recherche équilibrés conçus pour être efficaces sur des disques ou d'autres unités de stockage secondaire à accès direct. Dans une application classique ayant recours aux B_arbres, la quantité de données gérées est si grande quelles ne tiennent pas toutes en même temps dans la mémoire principale. Généralisation des ABR

65 Th_Info_B M. BENJELLOUN Éclatement d'une racine

66 Th_Info_B M. BENJELLOUN Soient - B boules blanches et N boules noires dans une urne. - B 0, N 0, B+N 1 - Une réserve infinie de boules Mode de fonctionnement Tirage aveugle de 2 boules - si les boules sont de même couleur, on remet une boule noire dans l'urne - sinon, on remet une boule blanche Le jeu se termine lorsqu'il ne reste plus qu'une boule dans l'urne Question Quelle est la couleur de la dernière boule connaissant les nombres initiaux N et B? Jeu de l'urne Éviter de réinventer la roue

67 Th_Info_B M. BENJELLOUN Le jeu se terminera-t-il ou pas? Le jeu se terminera car à chaque tirage, le nombre de boules dans l'urne diminue de 1. Tirage aveugle de 2 boules - si les boules sont de même couleur, on remet une boule noire dans l'urne - sinon, on remet une boule blanche

68 Th_Info_B M. BENJELLOUN RESOLUTION : Le jeu se terminera car à chaque tirage, le nombre de boules dans l'urne diminue de 1. Exemple avec 3 Boules: GENERALISER 2Bles de même couleur N sinon, on remet boule blanche

69 Th_Info_B M. BENJELLOUN GENERALISER !! Impensable

70 Th_Info_B M. BENJELLOUN AUTRE APPROCHE : Tirages possibles et propriétés? (B-2) + (N+1) B + (N-1) Conclusion La parité des blanches est inchangée. Donc, si le nombre initial B est impair, la dernière boule sera blanche, sinon, elle sera noire.


Télécharger ppt "Th_Info_B - 80 M. BENJELLOUN 2003-2004 Arbres Un arbre est soit un arbre atomique (une feuille), soit un noeud et une suite de sous-arbres. racine feuilles."

Présentations similaires


Annonces Google