Les structures d'rbres en mémoire secondire Introduction Les méthodes pr tbles d'index sont limités à certins type de fichiers (petits fichiers ou fichiers sttiques). Les méthodes bsées sur les structures d'rbres sont mieux dptées ux fichier volumineux et/ou dynmques. Afin de mieux occuper l'espce des blocs, on utilise des rbres m-ires. Les rbres de recherche m-ires Un rbre de recherche m-ires est l générlistion d'un rbre de recherche binire pour les ordres > 2 Un rbre de recherche m-ires d'ordre n est un rbre où chque noeud peut voir u mximum n fils (Fils[1..n]) et n-1 vleurs (Vl[1..n-1]). Les vleurs à l'intérieur d'un noeud sont ordonnées en ordre croissnt. Les fils sont orgnisés en fonction des vleurs du noeuds, selon les règles suivntes : i) Le Fils[1] pointe un sous-rbre contennt des vleurs < à Vl[1] ii) Le Fils[i] pointe un sous-rbre contennt des vleurs > Vl[i-1] et < Vl[i], pour i=2..n-1 iii) Le Fils[n] pointe un sous-rbre contennt des vleurs > Vl[n-1] Le degré d'un d'un noeud (le nombre de fils) est le nombre de vleurs stockées plus un. L figure ci-dessous montre un rbre de recherche m-ires d'ordre 5 de rcine le noeud. Le noeud b est le fils 1 de et f est le fils 5 de. Un noeud interne peut voir certins fils à nil et d'utres non. Pr exemple tous les fils de b à prt le 3e sont à nil. De même, les fils 1, 3 et 4 du noeud d sont à nil, lors que son fils 2 (pointe h) et son fils 5 (pointe i) sont différents de nil. 24 40 67 82 b c d e f 2 5 12 20 27 30 42 50 55 60 71 80 90 95 97 99 g h i 10 47 48 63 65 66 L recherche d'une vleur C commence dns le noeud rcine P et se poursuit le long d'une brnche : 1- Si C existe dns P lors stop vec succès 2- Si C n'existe ps dns P lors soit k l position dns P où devrit être insérer C (pour que les vleurs restent ordonnées) P := Fils[k] Si P différent de nil lors ller à 1 Sinon stop vec échec. Notes de cours : Arbres en MS Algo2 (Structures de données) 1
Pr exemple, l recherche de 48 dns l'rbre de l figure précédente se déroule comme suit: on commence l recherche dns le noeud. L vleur 48 n'existe ps et est comprise entre 40 et 67. Donc le prochin noeud à visiter est le Fils[3] (le noeud d) l recherche se poursuit dns le noeud d, et le prochin noeud à explorer est le Fils[2], cr 48 est comprise entre 42 et 50 on continue l recherche dns le noeud h. L vleur 48 existe (Vl[2]), on s'rrête donc vec succès. Si on vit recherché l vleur 15, on urit visité d'bord le noeud, puis le noeud b (Fils[1] de, cr 15 < 24). Là on serit rrêté vec un échec, cr 15 est comprise entre 12 et 20 et le Fils[4] de b est à nil. Pour insérer une nouvelle vleur V dns un rbre de recherche m-ires, on recherche d'bord l vleur, pour vérifier qu'elle n'existe ps déjà et pour locliser le noeud P où doit être insérée cette vleur (P est le dernier noeud visité dns l recherche). L recherche retourne ussi l'indice k où devrit être insérée V s'il y vit de l'espce dns P. Si P n'est ps plein, on insère V dns P, pr déclges fin de grder le tbleu de vleurs ordonné. Sinon (P est plein) : on lloue un nouveu noeud Q contennt une seule vleur (Vl[1] =V) et deux fils à nil (Fils[1] = nil et Fils[2] = nil) on fit pointer le nouveu noeud Q pr le Fils[k] de P (qui étit, vnt l'insertion, forcément à nil). L'indice k est celui retourné pr l recherche. Pr exemple, si on insère l vleur 64 dns l'rbre de l figure précédente, on procéder comme suit: 1- recherche de 64 échec (le dernier noeud visité est i et l position où devrit être insérée 64 est k=2) 2- comme le noeud i n'est ps plein, on peut lors insérer 64 à l position 2 en déclnt à droite les vleurs > 64 24 40 67 82 b c d e f 2 5 12 20 27 30 42 50 55 60 71 80 90 95 97 99 g h i 10 47 48 63 64 65 66 Si on insère encore l vleur 62, on llouer lors un nouveu noued (j) qui v contenir 62 et il ser pointé pr le Fils[1] du noeud i (i étnt le dernier noeud visité dns l recherche de 62 et l position ou devrit être insérer 62 dns i, s'il y vit de l'espce, est k = 1) L figure suivnte montre le résultt d'une telle insertion: Notes de cours : Arbres en MS Algo2 (Structures de données) 2
24 40 67 82 b c d e f 2 5 12 20 27 30 42 50 55 60 71 80 90 95 97 99 g h i 10 47 48 63 64 65 66 j 62 Un rbre de recherche m-ires est dit «Top-Down» si tous ces noeuds internes sont remplis à 100%. L'lgorithme d'insertion présenté mintient cette propriété. L suppression d'une vleur V peut être logique (ce qui fvorise le mintient de l propriété top-down) ou bien physique en générlisnt l suppression des rbres de recherche binires (mis le mintient de l propriété top-down est plus difficile). - En mémoire secondire Chque noeud de l'rbre est représenté pr un bloc d'e/s. L structure générle d'un bloc est lors comme suit : type Tbloc = structure Vl : tbleu[n-1] de typeqlq; Fils : tbleu[n] d'entier; degré : entier; Fin; // enregistrements ou (clés-dr) // numéros de blocs // nb d'elt dns Fils Prmi les crctéristiques d'un fichier vu comme rbre, il y l rcine. C'est le numéro du bloc contennt l rcine de l'rbre. Pr exemple, si l'rbre de l figure précédente étit un fichier, le contenu du bloc d serit comme suit: Vl Fils 42 50 55 60-1 h -1-1 i 1 2 3 4 5 5 degré Notes de cours : Arbres en MS Algo2 (Structures de données) 3
lors que le contenu du bloc g serit : Vl Fils 10-1 -1 1 2 3 4 5 2 degré Le module suivnt permet de réliser une recherche dns un fichier orgniser sous forme d'un rbre de recherche m-ires Rech( c:typeqlq; nomf:chine; vr trouv:booleen; vr i,j,prec:entier) /* * recherche c et retourne en plus du booléen trouv, le num de bloc (i) qui contient c insi que s * position (j) dns Vl et le num (prec) du bloc qui précède i. * Si c n'existe ps, lors i ser positionnée à -1 et prec indique le num du dernier bloc visité. * l position ou devrit se trouver c dns le bloc prec est indiquée pr j. */ Debut Si ( nomf <> '' ) Ouvrir( F, nomf, 'A') Fsi; i := Entete(F,1); // le num du bloc rcine prec := -1; j := 1; trouv := FAUX; TQ ( Non trouv et i <> -1 ) LireDir( F, i, buf ); // recherche interne dns le bloc j := 1; TQ ( Non trouv et j < buf.degre ) Si ( c = buf.vl[j].cle ) trouv := VRAI Sinon j := j+1 Fsi FTQ; // fin de l recherche interne. Si ( Non trouv ) prec := i; i := buf.fils[j] Fsi FTQ; Si ( nomf <> '' ) Fermer(F) Fsi; Fin L'insertion d'une nouvelle vleur (enregistrement ou clé/dr) dns le fichier utilise l recherche: Ins( e:tenreg; nomf:chine ) Debut Ouvrir( F, nomf, 'A' ); Si ( Entete(F,1) = -1 ) i := AllocBloc( F ); // Si le fichier est vide Notes de cours : Arbres en MS Algo2 (Structures de données) 4
Aff_entete( F, 1, i ); // l nouvelle rcine buf.degre := 1; buf.vl[1] := e; buf.fils[1] := -1; buf.fils[2] := -1; EcrireDir( F, i, buf ); Sinon Rech( e.cle, '', trouv, i, j, prec ); Si ( Non trouv ) // si le dernier bloc visité n'est ps plein, on y insère l'enreg e Si ( buf.degre < N ) // déclges interne à prtir de j Pour k := buf.degre, j+1, -1 // boucle rrière vec ps = -1 buf.vl[k] := buf.vl[k-1]; buf.fils[k+1] := buf.fils[k]; FinPour // insérer e à l pos j buf.vl[j] := e; // et son «fils droit» à nil buf.fils[j+1] := -1; // incrémenter le degré buf.degre := buf.degre + 1; EcrireDir( F, prec, buf ); Fin Sinon // si le bloc est plein, il fut llouer un nouveu i := AllocBloc( F ); // et le chîner vec le précédent buf.fils[j] := i EcrireDir( F, prec, buf ); // insérer e à l pos 1 du nouveu bloc buf.degre := 1; buf.vl[1] := e; buf.fils[1] := -1; buf.fils[2] := -1; EcrireDir( F, i, buf ) Fsi Fsi // Non trouv Fsi // Entete(F,1) = -1 Fermer(F) Notes de cours : Arbres en MS Algo2 (Structures de données) 5
Les B-Arbres Ceux sont des rbres de recherche m-ires qui restent toujours équilibrés et sont donc très utilisés pour gérer des fichiers volumineux et dynmiques. Inventés pr R. Byer et E. Mc Creight en 1972, les B-Arbres sont devenus un stndrd de fcto à cuse de leurs performnces remrqubles et ce, jusqu'à nos jours. Pour simplifier l présenttion, on choisir un ordre impir ( N = 2d+1 ) Dns un B-Arbre d'ordre N : tous les noeuds à prt l rcine, sont remplis u minimum à 50% (soit d vleurs) l rcine peut contenir u minimum 1 vleur toutes les brnches ont l même longueur (rbre complètement équilibré) L figure ci-dessous montre un B-Arbre d'ordre 5 (d=2) 24 40 70 b c d e 2 5 12 20 27 30 42 50 55 60 71 80 97 L recherche dns un B-Arbre est similire à l recherche dns un rbre de recherche m-ires. L différence se situe dns l'lgorithme d'insertion et l'lgorithme de suppression. Pour insérer une vleur V dns un B-Arbre de rcine R, on procède comme suit : On insère V et son fils droit fd (initilement fd = -1), c--d si V ser insérée à une position j dns un noeud, lors il fudr insérer ussi «son fils droit» fd à l position j+1 (dns le tbleu des fils) 1- rechercher V, pour vérifier qu'elle n'existe ps et trouver le dernier noeud feuille visité (P) 2- si P n'est ps plein, on insère (V,fd) dns P pr déclges internes et on s'rrête. 3- si P est déjà plein, lors il v «éclter» en deux (P et Q, un nouveu noeud lloué) : ) former l «séquence ordonnée» des vleurs de P + l vleur V b) ffecter les d premières vleurs vec les d+1 premiers fils u noeud P c) ffecter les d dernières vleurs vec les d+1 derniers fils u nouveu noeud Q d) insérer l vleur du milieu (celle qui se trouve à l position d+1 dns l séquence ordonnée) dns le noeud prent de P. Le fils droit de cette vleur ser le noeud Q Aller à 2 Pr exemple, l'insertion de 76 dns le B-Arbre de l figure précédente, se déroule comme suit: 1- recherche de 76 trouv =FAUX, le dernier visité = e (c'est une feuille) et l position où doit être insérée 76 est 2 2- comme le noeud e n'est ps plein, on insère lors 76 vec son «fils droit» -1 respectivement ux positions 2 dns le tbleu Vl et 3 dns le tbleu Fils du noeud e On obtient lors le B-Arbre ci-dessous : Notes de cours : Arbres en MS Algo2 (Structures de données) 6
24 40 70 b c d e 2 5 12 20 27 30 42 50 55 60 71 76 80 97 Si on insère mintennt l vleur 57, c'est le noeud d qui ser visité en dernier pr l recherche. L position de 57 dns d devrit lors être 4 (et son fd à l position 5) Comme le noeud d est déjà plein, il y ur lors un «écltement» (cel veut dire, lloction d'un nouveu noeud, f pr exemple) ) formtion de l «séquence ordonnée»: Vl : 42, 50, 55, 57, 60 Fils: -1, -1, -1, -1, -1, -1 b) les d premières vleurs ( 42, 50 ) et les d+1 premiers fils (-1, -1, -1) seront ffectés u noeud e les d dernières vleurs ( 57, 60 ) vec les d+1 derniers fils (-1, -1, -1) seront ffectés u noeud f l vleur du milieu (55) vec comme fils-droit (f) seront insérés dns le noeud prent () comme le noeud n'est ps plein, l'insertion de ( 55, f ) peut se fire pr déclges internes On obtient lors le B-Arbre suivnt: 24 40 55 70 b c d f e 2 5 12 20 27 30 42 50 57 60 71 76 80 97 Si on continue l'insertion de 7, le noeud b v «éclter» (donc lloction d'un nouveu noeud g) l séquence ordonnée des vleurs de b + l vleur 7 est formée: Vl : 2, 5, 7, 12, 20 Fils: -1, -1, -1, -1, -1, -1 Les vleurs (2 et 7) vec les 3 premiers fils restent dns b. Les vleurs (12 et 20) vec les 3 derniers fils seront ffectés u nouveu noeud g. L vleur du milieu (7) vec comme fils-droit le noeud g seront insérés dns le pere (). Comme le noeud est lui ussi plein, il v lors «éclter» à son tour. Un nouveu noeud h est lors lloué et l séquence ordonnée est formée : Vl : 7, 24, 40, 55, 70 Fils: b, g, c, d, f, e Les d premières vleurs (7 et 24) vec les 3 premiers fils (b, g et c) restent dns. Les d dernières vleurs (55 et 70) vec les 3 derniers fils (d, f et e) seront ffectés u nouveu noeud h. L vleur du milieu (40) vec comme fils-droit le noeud h seront insérés dns le père du noeud. Comme le noeud étit l rcine de l'rbre (il n' donc ps de père), une nouvelle rcine (i) est lors llouée contennt uniquement l vleur 40 vec comme fils-guche (Fils[1]), l'ncienne rcine () et Notes de cours : Arbres en MS Algo2 (Structures de données) 7
comme fils-droit (Fils[2]) le noeud h. L figure suivnte, montre l'rbre obtenu : i 40 7 24 h 55 70 b g c d f e 2 5 12 20 27 30 42 50 57 60 71 76 80 97 Qund l rcine d'un B-Arbre éclte (à cuse d'une insertion), l profondeur de l'rbre ugmente d'un niveu. Notes de cours : Arbres en MS Algo2 (Structures de données) 8