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

INFO 2014 Fichiers et base de données Philippe Fournier-Viger Département d’informatique, U.de Moncton Bureau D216,

Présentations similaires


Présentation au sujet: "INFO 2014 Fichiers et base de données Philippe Fournier-Viger Département d’informatique, U.de Moncton Bureau D216,"— Transcription de la présentation:

1 INFO 2014 Fichiers et base de données Philippe Fournier-Viger Département d’informatique, U.de Moncton Bureau D216, philippe.fournier-viger@umoncton.ca 2015 1

2 Calendrier 2 TP2 énoncé TP1 énoncé

3 L’INDEXATION 3

4 Introduction Plusieurs applications demandent de traiter une grande quantité d’information qui ne peut pas être stockée en mémoire vive. Ex.: ◦ inventaire d’un grand magasin, ◦ historique d’information météorologique, ◦ dossiers médicaux de patients d’un hôpital, ◦ données sur les joueurs d’un jeu massivement multi joueur. Cette information est stockée dans de grands fichiers ou bases de données. 4

5 Introduction (suite) Plusieurs opérations peuvent être requises: ◦ insérer, supprimer, rechercher… En particulier, la recherche est une fonction clé pour de nombreuses applications traitant de grand fichiers ou base de données. La performance est souvent importante. Considérons le scénario de la recherche dans un fichier stocké sur le disque dur.  5

6 La structure de fichier que nous considérerons MatriculeNomPrénomProgramme 1234567666RoyLindaAdministration 1234567777SauvéPaulÉducation 1234569999PierreMarcBiologie 1234568888SauvéPaulInformatique ……….… 1234568668FournierJeanInformatique champ enregistrements de taille fixe ou variable, de différents types (date, entier, etc.) 6

7 La structure de fichier que nous considèrerons (suite) MatriculeNomPrénomProgramme 1234567666RoyLindaAdministration 1234567777SauvéPaulÉducation 1234569999PierreMarcBiologie 1234568888SauvéPaulInformatique ……….… 1234568668FournierJeanInformatique clé primaire (valeurs uniques) clés secondaires (valeurs pas nécessairement uniques) Comment faire la recherche dans un tel fichier sur disque? 7

8 Recherche Solution 1: Recherche séquentielle. Supposons un fichier non trié. Parcourir le fichier séquentiellement sur le disque jusqu’à ce qu’on trouve la clé. Très coûteux, en moyenne n / 2 où n est la taille du fichier. 8

9 Recherche Solution 2: Hachage. Concevoir une fonction de hachage sur une clé. La fonction de hachage permet de calculer la position de l’enregistrement sur le disque. Clé Fonction de hachage Emplacement sur le disque 9

10 Recherche Solution 2: Hachage (suite) Efficient seulement pour des recherches par clé. Or, pour certaines applications, l’utilisateur désire faire des requêtes plus complexes telles que: ◦ trouver l’enregistrement avec la valeur de clé la plus grande, ◦ parcourir les enregistrement par ordre de valeur de clé, ◦ trouver tous les enregistrements avec une clé dans un intervalle donné. 10

11 Recherche Solution 2: Hachage (suite) De plus, la performance O(1) se dégrade s’il y a des collisions (plusieurs accès disque peuvent être nécessaires). Hachage ouvert Hachage par sceau table de hachage débordement 11

12 Recherche (suite) Solution 3: Utilisé un fichier trié Trier le fichier selon la clé qui nous intéresse avec un algorithme de tri externe. Utiliser un algorithme de recherche pour une liste triée (ex.: recherche par interpolation, recherche binaire…). Cela ne fonctionne qui si l’on effectue des recherches toujours sur la même clé. Or en pratique, l’utilisateur désire souvent effectuer des recherches avec plusieurs clés. De plus, si un nouvel enregistrement était inséré, il faudrait potentiellement trier à nouveau. 12

13 Recherche (suite) Solution 3: Utilisé un fichier trié (suite) Utiliser une liste auto-organisée ou triée par fréquence ne règlerait pas le problème. 13

14 Recherche (suite) Solution 4: Utiliser des index Un index est: ◦ un ensemble de paires associant une clé à l’emplacement d’un enregistrement dans le fichier. ◦ un ordonnancement logique sur les enregistrements. Indexation: processus de création d’un index. Le fichier index sur le matricule MatriculePointeur 1234567666 octet 0 1234577777 octet 128 1234569999 octet 256 1234588888 octet 512 14

15 On peut construire un index pour chaque clé Exemple: Recherche (suite) Le fichier index sur le matricule MatriculePointeur 1234567666 octet 0 1234577777 octet 128 1234569999 octet 256 1234588888 octet 384 index sur le nom NomPointeur Pierre octet 256 Roy octet 0 Sauvé octet 128 Sauvé octet 384 Un index pourrait être une liste triée par clé ou bien un arbre pour avoir de meilleures performances de recherche! 15

16 Observation Les recherches sont rarement faites sur la clé primaire, mais plutôt sur les clés secondaires (ex.: salaire plutôt que le # de matricule). MatriculeNomPrénomSalaire 1234567666RoyLinda500 $ 1234567777SauvéPaul1500 $ 1234569999PierreMarc500 $ clé secondaire (salaire) clé primaire (matricule) 16

17 Index Un index sur une clé primaire est appelé un index primaire. Un index sur une clé secondaire est appelé un index secondaire. Un index secondaire peut référer à des clés d’un index primaire plutôt qu’un pointeur vers le fichier. Généralement, il y a un seul index primaire et un ou plusieurs index secondaires. 17

18 L’indexation La création des index. Un processus important dans tout système de gestion de bases de données. Plusieurs méthodes d’indexation telles que: ◦ hachage,  recherche par clé seulement ◦ une simple liste triée par clé:  peu efficient pour insertion et suppression, ◦ utiliser un index en arbre  B-Arbre, B+Arbre…  le type d’indexation le plus utilisé pour de larges bases de données stockées sur disque.  insertion, suppression, recherche par intervalle… 18

19 L’indexation (suite) Défis: pouvoir réaliser toutes les opérations utiles (recherche par clé, par intervalle, etc.) minimiser les accès disque requis pour les opérations désirées, minimiser les accès disque pour l’ajout ou la suppression d’enregistrements et la mise à jour des index, … 19

20 INDEXATION LINÉAIRE 20

21 Index linéaire Un index linéaire est une séquence de paires où chaque pointeur indique soit: ◦ la position d’un enregistrement sur le disque, ◦ ou bien une clé primaire dans l’index primaire, Illustration: (pas trié) (trié) 21

22 Un index linéaire peut être stockée en mémoire vive ou sur disque (dépendant de la taille), Avantages d’un index linéaire: permet un accès simple à des enregistrements de taille variable, recherche et accès aléatoire efficient grâce à la recherche binaire. Index linéaire (suite) (pas trié) (trié) 22

23 Index linéaire à deux niveaux Si un index linéaire ne peut entrer en mémoire vive, il doit être stocké sur le disque. Dans ce cas, la recherche binaire devient moins efficace. une solution: deux niveaux d’index. ◦ un index sur le disque ( « index de niveau 1 »), ◦ un index sur l’index en mémoire vive ( « index de niveau 2 »). Exemple  23

24 Index linéaire de niveau 1 (sur le disque) Stocké sur des secteur de 1024 octets. Index linéaire de niveau 2 (en mémoire vive) Des paires indiquant la première valeur de clé de chaque secteur de l’index de niveau 1. Recherche: 1.L’index de niveau 2 est consulté pour trouver la plus grande valeur inférieure ou égale à la clé cherchée, 2.Le secteur correspondant de l’index de niveau 1 est chargé en mémoire. 3.Une recherche binaire est faite dans le secteur pour obtenir l’emplacement de l’enregistrement sur le disque. 24 en mémoire vive sur disque dur

25 Index linéaire à deux niveaux(suite) Taille de l’index de niveau 2 (en mémoire vive) Si 500 secteurs contenant 10,000 enregistrements, l’index de niveau 2 ne contiendra que 500 entrées. Coût d’une recherche? 2 accès disque (un pour lire le secteur de l’index de niveau 1 et un pour l’accès à l’enregistrement). Insertion/suppression d’un enregistrement: coûteux! demande de mettre à jour tous les index de niveau 2 (possiblement de tout décaler…). 25

26 Index à deux dimensions Considérons un index à deux niveaux sur une clé secondaire tel que « Nom ». Si plusieurs enregistrements possèdent la même valeur pour la clé secondaire, il se peut que l’index de niveau 2 contiennent plusieurs entrées correspondant aux mêmes valeurs. Ceci peut représenter un gaspillage d’espace. Un fichier: AA10JonesPaul.. AB12JonesMarc… AB39JonesLuc… AX33SmithJohn… ……….. clé primaire clé secondaire 26

27 Index linéaire à deux dimensions (suite) Une solution: Pour l’index de niveau 2 (en mémoire vive), un tableau a deux dimensions : une clé secondaire et une clé primaire. Permet de chercher par clé secondaire en premier, puis par clé primaire (ex.: par recherche binaire sur la clé secondaire). clés secondaires (rangées) clés primaires ou pointeurs 27

28 Index linéaire à deux dimensions (suite) L’insertion/suppression d’un enregistrement demande de mettre à jour une seule ligne. Si une nouvelle clé secondaire, alors une ligne est ajoutée au tableau. Problème: taille fixe, espace inutilisé. clés secondaires (rangées) clés primaires ou pointeurs 28

29 Index linéaire à deux dimensions (suite) Une meilleure solution: Liste inversée: un tableau et des listes chaînées. Efficient en mémoire vive, moins sur le disque, car une liste chaînée peut être stockée sur plusieurs secteurs. clés primaires ou pointeurs clés secondaires On dit « inversée » car les accès se font par la clé secondaire, puis par la clé primaire. 29

30 Une alternative: Toutes les listes chaînées sont stockées dans un même tableau. Pourrait permettre d’économiser de l’espace.. 30

31 L’APPROCHE D'INDEXATION ISAM (UNE APPROCHE HISTORIQUE PAR IBM NOMMÉE ISAM: INDEXED SEQUENTIAL ACCESS METHOD ~1974) 31

32 Introduction Les approches à base d’index linéaires ont en général des difficultés avec les mises à jour fréquentes. ◦ risque de décalage complet! Les listes inversées aident à résoudre ce problème, mais seulement si le nombre de valeurs de clé secondaire est largement inférieur au nombre d’enregistrements. Nous discuterons de l’approche ISAM, une tentative de résoudre le problème de la gestion de grandes bases de données. Puis, nous verrons comment une approche à base d’arbre en pallie les problèmes. 32

33 ISAM Développé par IBM. Une tentative pour gérer de grandes bases de données. Les enregistrements sont triés par clé primaire. Un fichier est divisé sur plusieurs cylindres sur le disque. Les données sur chaque cylindre sont une partie de liste triée. 33

34 ISAM (suite) Un cylindre n’est pas rempli. Une zone appelée « débordement de cylindre » est laissée vide. En mémoire, une table indique la plus petite valeur pour chaque cylindre. Les nouveaux enregistrements sont insérés dans la zone « débordement de cylindre » de cylindre approprié. Si un cylindre est plein, une zone de débordement globale est utilisée. 34

35 ISAM (suite) Les étapes de la recherche avec ISAM: 1. Déterminer le cylindre contenant l’information en utilisant la table globale, 2. Consulter le bloc index du cylindre pour déterminer le bloc à consulter. 3. Si l’enregistrement est trouvé, la recherche est terminée. 4. Sinon, chercher dans la zone de débordement du cylindre. 5. Si non trouvé et que la zone est pleine, chercher dans la zone de débordement globale. 35

36 Performance Quand la base de données vient d’être construite: ◦ très efficient, ◦ seulement deux accès disque pour accéder à un enregistrement. Toutefois, après plusieurs insertions: ◦ les zones de débordement s’allongent, ce qui réduit la performance, ◦ éventuellement, la zone globale peut se remplir aussi, ce qui détériore davantage la performance 36

37 Performance (suite) une « solution » est de périodiquement restructurer la base de données en profondeur. Ceci demande de: ◦ balancer le nombre d’enregistrements par cylindres, ◦ trier les enregistrements dans chaque cylindre, ◦ mettre à jour la table globale, ◦ mettre à jour l’index pour chaque cylindre. 37

38 MyISAM Dans MySQL < 5.5, il était possible d’utiliser un stockage en utilisant une version de ISAM nommée « MyISAM ». « MyISAM » est offert en option dans MariaDB. Utile pour des applications où la lecture des données est intensive et peu de modifications. Limites importantes: ne supporte pas les clés étrangères, l’intégrité référentielle et le concept de transactions. 38

39 INDEXATION À BASE D’ARBRES 39

40 Introduction L’indexation linéaire est efficiente quand la base de données est statique. ISAM est efficient pour des mises à jour limitées. Un autre problème avec ISAM est lorsque l’index global ne peut pas être stocké en mémoire vive à cause d’un trop grand nombre de cylindres pour stocker le fichier. 40

41 Introduction (suite) De façon générale, une application de base de données a les caractéristiques suivantes: ◦ un grand nombre d’enregistrements mis à jour fréquemment, ◦ la recherche est faite en combinant une ou plusieurs clés, ◦ la recherche par intervalle ou par minimum ou maximum est utilisée. Il faut donc trouver une meilleure organisation… 41

42 Arbres binaires? On pourrait utiliser des arbres binaires pour les index plutôt que des listes. ◦ un arbre binaire peut stocker des données en double ◦ insertion/suppression, recherche efficiente, ◦ recherche par intervalle,.. En mémoire vive, cela fonctionnerait bien. 42

43 Arbres binaires? (suite) Toutefois les arbres peuvent être débalancés (souvent par un facteur de 2 ou plus). En mémoire vive, ce n’est pas un problème, car O(log n). Sur disque, par contre, cela a un grand impact. ◦ Tous les nœuds d’un chemin doivent être lu à partir du disque, ◦ Dans le pire cas, les nœuds sont sur des blocs différents. ◦ Plus un chemin est long, plus il y a d’accès disque. ◦ Un bassin de tampon aiderait, mais ne réglerait pas le problème… 43

44 Illustration (pire cas) 44 1 2 3 4 Dans ce cas, l’arbre binaire opère comme une liste chaînée. O(n) opérations.

45 Arbres binaires? (suite) Deux problèmes importants à résoudre: ◦ comment s’assurer que l’arbre reste balancé? ◦ comment arranger les feuilles sur des blocs de façon à réduire le nombre de blocs à lire pour tous les chemins? Ajouter une technique de balancement à un arbre binaire et allouer les nœuds à des blocs? ◦ difficile à réaliser pour insertions et suppressions sans faire des réorganisations majeures. Exemple  45

46 Exemple L’élément « 1 » est inséré dans l’arbre. Balancer l’arbre requiert de réorganiser l’arbre au complet. arbre initialrésultat 46

47 Une solution Choisir un autre type d’arbre qui permet le balancement et peut être modifié pour stocker les nœuds par blocs tel que: ◦ arbre AVL ◦ arbre splay (section 13.2) ◦ arbre 2-3 ◦ … Nous discuterons des arbres 2-3, ce qui nous amènera aux B arbres, puis B+ arbres. 47

48 LES ARBRES 2-3 48

49 Arbres 2-3 Trois propriétés: 1.Un nœud contient une ou deux clés, 2.Chaque nœud interne a deux fils (s’il contient une clé) ou trois fils (s’ils contient deux clés) 3.L’arbre est toujours balancé (toutes les feuilles sont au même niveau). 49

50 Arbres 2-3 Propriétés pour la recherche: Toutes les valeurs du sous-arbre de gauche sont inférieures à la valeur de la première clé. S’il y a un arbre à droite, alors toutes les valeur du sous-arbre du centre sont inférieures à la valeur de la deuxième clé, et les valeurs du sous-arbre de droite sont plus grandes que la valeur de la deuxième clé. 50

51 Arbres 2-3 Un nœud contient des enregistrements complets ou des pointeurs. Les feuilles peuvent contenir une ou deux clés. 51

52 Arbres 2-3 - Classe « Nœud » variables méthodes 52

53 Arbres 2-3 - Classe « Nœud » (suite) Observations: La classe « Nœud » ne distingue pas entre nœud et feuille. Elle est donc inefficiente, car trois pointeurs seront inutilisés pour les feuilles. La classe « Nœud » est une classe « privée » utilisée par la classe « Arbre » (non présentée). 53

54 Au minimum combien de feuilles un arbre 2-3 de hauteur k possède t’il? Si chaque nœud a deux fils, cela devient un arbre binaire. Donc, un arbre de taille k doit avoir aura au moins 2 k-1 feuilles Ex.: k = 4 2 4-1 = 8 Arbres 2-3 54

55 Au maximum combien de feuilles un arbre 2-3 de hauteur k possède t’il? Si chaque nœud a trois fils, un arbre de taille k doit avoir aura au plus 3 k-1 feuilles Ex.: k = 4 3 4-1 = 27 Arbres 2-3 55

56 Plus précisément Un arbre de taille k aura combien de noeuds? ◦ minimum: 2 0 + 2 1 + … + 2 k-2 + 2 k-1 ◦ maximum: 3 0 + 3 1 + … + 3 k-2 + 3 k-1 Exemple: considérons k = 4 ◦ 2 0 + 2 1 + 2 2 + 2 3 = 15 nœuds ◦ 3 0 + 3 1 + 3 2 + 3 3 = 40 nœuds 56

57 Arbre 2-3 - recherche La recherche dans un arbre 2-3 est similaire à la recherche dans un arbre binaire (les clés d’un nœud déterminent dans quel arbre chercher). Ex.: 30 <> >= 57

58 Arbre 2-3 - recherche La recherche dans un arbre 2-3 est similaire à la recherche dans un arbre binaire (les clés d’un nœuds déterminent dans quel arbre chercher). Ex.: 15 < > = 58

59 Arbre 2-3 - recherche La recherche dans un arbre 2-3 est similaire à la recherche dans un arbre binaire (les clés d’un nœuds déterminent dans quel arbre chercher). Ex.: 16 < > >Non trouvé! 59

60 Arbre 2-3 – recherche (suite) Méthode pour la recherche d’une clé dans un arbre 2-3. Retourne un enregistrement de type E. 60

61 Arbre 2-3 – insertion Insertion dans un arbre 2-3: Similaire à l’insertion dans un arbre binaire sauf que l’arbre ne croît pas vers le bas comme suite à l’ajout d’un nœud. 61

62 Arbre 2-3 – insertion Exemple 1: insertion de 14 (cas simple) Première étape: trouver le nœud L qui contiendrait l’élément s’il était dans l’arbre. < > 62

63 Arbre 2-3 – insertion Deuxième étape: insérer la valeur. Puisque le nœud n’est pas plein, on insère la valeur directement dans le nœud (cas simple). < > 63

64 Arbre 2-3 – insertion (suite) Exemple 2: Insertion de 55 Première étape: trouver le nœud L qui contiendrait l’élément s’il était dans l’arbre. >> > L 64

65 Arbre 2-3 – insertion (suite) Deuxième étape Si le nœud L est une feuille contenant deux valeurs, alors: L est divisé en deux et un nœud L’ est créé. L reçoit la plus petite valeur des trois. L’ reçoit la plus grande valeur. La valeur du milieu est passée au parent avec un pointeur à L’ (promotion). Si le parent contient deux nœuds, le processus est répété. >> > L 65

66 Arbre 2-3 – insertion (suite) Deuxième étape Si le nœud L est une feuille contenant deux valeurs, alors: L est divisé en deux et un nœud L’ est créé. L reçoit la plus petite valeur des trois. L’ reçoit la plus grande valeur. La valeur du milieu est passée au parent avec un pointeur à L’ (promotion). Si le parent contient deux nœuds, le processus est répété. L’L 66

67 Arbre 2-3 – insertion (suite) Exemple 3: ajout de 19 S’il est nécessaire de diviser le nœud racine, alors cela ajoutera un nouveau niveau à l’arbre. > < < Il faut diviser, mais comme il y déjà trois nœuds fils du parent, il faudra aussi diviser le nœud parent 67

68 Arbre 2-3 – insertion (suite) Exemple 3: ajout de 19 S’il est nécessaire de diviser le nœud racine, alors cela ajoutera un nouveau niveau à l’arbre. 68

69 Arbre 2-3 – insertion (suite) Exemple 3: ajout de 19 S’il est nécessaire de diviser le nœud racine, alors cela ajoutera un nouveau niveau à l’arbre. 69

70 Arbre 2-3 – insertion (suite) Exemple 3: ajout de 19 S’il est nécessaire de diviser le nœud racine, alors cela ajoutera un nouveau niveau à l’arbre. 70

71 Exercice Création d’un arbre 2-3 en insérant successivement les nombres: 50, 60, 70, 40, 30, 20, 10, 80, 90, 100 Résultat final: 71

72 Exercice Création d’un arbre 2-3 en insérant successivement les nombres: 50, 60, 70, 40, 30, 20, 10, 80, 90, 100 Résultat final: 50 72

73 Exercice Création d’un arbre 2-3 en insérant successivement les nombres: 50, 60, 70, 40, 30, 20, 10, 80, 90, 100 Résultat final: 50 60 73

74 Exercice Création d’un arbre 2-3 en insérant successivement les nombres: 50, 60, 70, 40, 30, 20, 10, 80, 90, 100 Résultat final: 60 5070 74

75 Exercice Création d’un arbre 2-3 en insérant successivement les nombres: 50, 60, 70, 40, 30, 20, 10, 80, 90, 100 Résultat final: 60 40 5070 75

76 Exercice Création d’un arbre 2-3 en insérant successivement les nombres: 50, 60, 70, 40, 30, 20, 10, 80, 90, 100 Résultat final: 40 60 305070 76

77 Exercice Création d’un arbre 2-3 en insérant successivement les nombres: 50, 60, 70, 40, 30, 20, 10, 80, 90, 100 Résultat final: 40 60 20 305070 77

78 Exercice Création d’un arbre 2-3 en insérant successivement les nombres: 50, 60, 70, 40, 30, 20, 10, 80, 90, 100 Résultat final: 40 2060 10 305070 78

79 Exercice Création d’un arbre 2-3 en insérant successivement les nombres: 50, 60, 70, 40, 30, 20, 10, 80, 90, 100 Résultat final: 40 2060 10 305070 80 79

80 Exercice Création d’un arbre 2-3 en insérant successivement les nombres: 50, 60, 70, 40, 30, 20, 10, 80, 90, 100 Résultat final: 40 2060 80 10 30507090 80

81 Exercice Création d’un arbre 2-3 en insérant successivement les nombres: 50, 60, 70, 40, 30, 20, 10, 80, 90, 100 Résultat final: 40 2060 80 10 30507090 100 81

82 Arbre 2-3 – insertion – le code Paramètres: rt: racine du sous arbre courant. k: la clé de l’enregistrement à insérer e: l’enregistrement à insérer. Retourne: pointeur vers un nœud Si rt est inchangé, un pointeur vers rt. Si changé, un pointeur vers la nouvelle racine du sous-arbre 82

83 83

84 Traverser un arbre 2-3 en ordre croissant de clés (ordre infixe) visite(nœud* courant) 1. SI courant.filsgauche != null visite(courant.filsgauche); 2. Écrire courant.clégauche; 3. Si courant.filscentre != null visite(courant.filscentre); 4. Écrire courant.clédroite; 5. Si courant.filsdroit != null visite(courant.filsdroit); 84 40 2060 10 305070 80

85 Arbre 2-3 – suppression (suite) Trois cas: 1. Si feuille avec 2 enregistrements. 2. Si feuille avec 1 enregistrement. 3. Si le nœud n’est pas une feuille. Cas 1: l’enregistrement est enlevé. Cas 2 et 3: l’enregistrement est remplacé par un autre qui prend sa place. Si aucun disponible, des nœuds frères sont fusionnés. Complexe! Un exemple  85

86 Suppression - exemple Considérez l’arbre suivant: 86 50 3065 90 10 20406070 80 99

87 Suppression - exemple Suppression de 65 87 50 3065 90 10 20406070 80 99

88 Suppression - exemple Suppression de 65 Puisque nœud interne, il faut remplacer 65 par la valeur suivante selon l’ordre infixe (ordre croissant). (sera toujours dans une feuille) Cette valeur est 70 80 prendra la place de 70 88 50 3065 90 10 20406070 80 99

89 Suppression - exemple 89 50 3070 90 10 20406080 99

90 Suppression - exemple Suppression de 70 90 50 3070 90 10 20406080 99

91 Suppression - exemple Suppression de 70 Puisque nœud interne, il faut remplacer 70 par la valeur suivante selon l’ordre infixe (ordre croissant). (sera toujours dans une feuille) Cette valeur est 80 91 50 3070 90 10 20406080 99

92 Suppression - exemple Suppression de 70 (suite) Résultat: un nœud est vide! Il faut fusionner deux nœuds pour réparer l’arbre. 92 50 3080 90 10 204060 99

93 Suppression - exemple Suppression de 70 (suite) Résultat: un nœud est vide! Il faut fusionner deux nœuds pour réparer l’arbre. 93 50 3080 90 10 204060 99

94 Suppression - exemple Suppression de 70 (suite) Résultat: un nœud est vide! Il faut fusionner deux nœuds pour réparer l’arbre. 94 50 3090 10 204060 80 99

95 Suppression - exemple Suppression de 99 Pour une feuille, on efface simplement la valeur. 95 50 3090 10 204060 80 99

96 Suppression - exemple Suppression de 99 Pour une feuille, on efface simplement la valeur. 96 50 3090 10 204060 80

97 Suppression - exemple Suppression de 99 Un nœud est vide. Il faut redistribuer les valeurs. Puisqu’un frère à une valeur à partager, on déplace de la façon suivante: 97 50 3090 10 204060 80

98 Suppression - exemple 98 50 3080 10 204060 90

99 Suppression - exemple Suppression de 80 80 est dans un nœud interne, donc on le remplace par son successeur en ordre infixe qui est 90. 99 50 3080 10 204060 90

100 Suppression - exemple Suppression de 80 80 est dans un nœud interne, donc on le remplace par son successeur en ordre infixe qui est 90. 100 50 3080 10 204060 90

101 Suppression - exemple Suppression de 80 80 est dans un nœud interne, donc on le remplace par son successeur en ordre infixe qui est 90. 101 50 3090 10 204060

102 Suppression - exemple Suppression de 80 Pour le nœud vide, on ne peut pas emprunter de valeur d’un frère, donc on doit fusionner. 102 50 3090 10 204060

103 Suppression - exemple Suppression de 80 Pour le nœud vide, on ne peut pas emprunter de valeur d’un frère, donc on doit fusionner. 103 50 30 10 204060 90

104 Suppression - exemple Suppression de 80 104 50 30 10 204060 90

105 Suppression - exemple Suppression de 80 Pour le nœud vide, on ne peut pas emprunter d’un frère, donc on doit fusionner. 105 50 30 10 204060 90

106 Suppression - exemple Suppression de 80 Pour le nœud vide, on ne peut pas emprunter d’un frère, donc on doit fusionner. 106 30 50 10 204060 90

107 Suppression - exemple Suppression de 80 Finalement, puisque la racine est vide, on change le pointeur de la racine vers le nœud fils. FIN 107 30 50 10 204060 90

108 Arbre 2-3 Propriété de balancement L’ajout et la suppression n’ajoutent pas de nœuds en bas de l’arbre. Ils provoquent plutôt la fusion ou la division de nœuds, causant un effet qui peut remonter jusqu’à la racine. La racine peut être divisée pour créer un nouveau niveau. Pour la suppression, si les deux derniers fils de la racine fusionnent, alors la racine est retirée et l’arbre perd un niveau. 108

109 Arbre 2-3 Quel est le coût de la recherche? L’arbre est toujours balancé donc le pire cas, on atteint une feuille à la profondeur maximale qui est log(n). Par conséquent, ajout, recherche et suppression prennent dans le pire cas O(log n) temps. Dans le meilleur cas, la clé se trouve à la racine. 109

110 Comparaison avec arbre binaire L’arbre 2-3 est toujours balancé. L’arbre 2-3 peut nécessiter davantage davantage d’espace. ◦ Un arbre binaire peut en théorie être stocké dans un tableau. 110

111 LES B-ARBRES 111

112 Les B-arbres Structure de données attribuée à: ◦ R. Bayer & E. M. McCreight (1972) Organization and Maintenance of Large Ordered Indices. Acta Informatica 1: 173–189. En 1979, les B-arbres avaient pratiquement remplacé toutes autres formes d’indexation pour de gros fichiers sauf le hachage. Les B-arbres sont l’approche standard pour organiser un fichier pour une application demandant insertion, suppression et recherche par intervalle. Utilisé pour les bases de données et les systèmes de fichiers. 112

113 Les B-arbres (suite) Les B-arbres adressent les principaux problèmes d’implémentation d’un arbre de recherche sur disque: un B-arbre est balancé (toutes les feuilles sont au même niveau) la mise à jour et la recherche affectent seulement quelques blocs du disque, les b-arbres conservent les enregistrements avec des clés similaires sur les mêmes blocs, les b-arbres garantissent que chaque nœud interne est plein à au moins un pourcentage minimum (efficience en termes d’espace et réduit le nombre d’accès disque) 113

114 Les B-arbres (suite) Les B-arbres sont une généralisation des arbres 2-3. Les arbres 2-3 sont vus comme des B- arbres d’ordre 3. 114

115 Les B-arbres (suite) Propriétés d’un arbre d’ordre m La racine est soit une feuille ou a au moins deux fils. Chaque nœud interne sauf la racine a entre m/2 et m fils. Un nœud peut avoir au maximum m -1 éléments. 115

116 Les B-arbres (suite) Nœud d’un B-arbre: Un nœud est équivalent à un bloc sur le disque. Le nombre d’entrées par nœud est déterminé en fonction de la taille d’un bloc sur le disque (peut typiquement contenir plus de 100 clés). Les pointeurs vers d’autres nœuds sont des adresses de bloc (nœud). 116

117 Les B-arbres (suite) Exemple: un B-arbre d’ordre 4: Cela est en quelque sorte un « arbre 3-4 ». Chaque nœud a au plus 3 clés. Un nœud peut avoir jusqu’à 4 fils. La racine est soit une feuille ou au moins deux fils. Les nœuds internes ont de 1 à 3 clés 117

118 Les B-arbres (suite) Exemple: un B-arbre d’ordre 5: 1 3 5 6 9 13 21 25 7 17 Cela est en quelque sorte un « arbre 4-5 ». Chaque nœud a au plus 4 clés. Un nœud peut avoir jusqu’à 5 fils. La racine est soit une feuille ou au moins 2 fils. Les nœuds internes ont de 2 à 4 clés 118

119 Les B-arbres (suite) Pour un accès efficient à chaque nœud sur disque: L’accès au B-arbre sur disque se fait généralement avec un bassin de tampon avec l’heuristique du plus ancien utilisé. 119

120 Recherche dans un B-arbre La recherche dans un B-arbre est une généralisation de la recherche dans un arbre 2-3. La recherche débute à la racine de l’arbre. La recherche est réalisée par l’alternance entre deux étapes. 120

121 Recherche dans un B-arbre (suite) Étapes de la recherche: 1. Effectuer une recherche binaire sur les enregistrements du nœud courant. 2. Si l’enregistrement avec la clé cherchée est trouvé, retourner l’enregistrement. 3. Si le nœud courant est une feuille et que la clé n’est pas trouvée, la recherche est un échec. 4. Sinon, suivre la branche appropriée et répéter le processus. 121

122 Recherche dans un B-arbre (suite) Exemple: recherche de 47 (pas présent) > (pas présent) > < Combien d’accès disque? 3 accès disque 122

123 Recherche dans un B-arbre (suite) Exemple: recherche de 46 (pas présent) > (pas présent) > < (pas présent) Recherche infructueuse! Combien d’accès disque? 3 accès disque 123

124 Insertion dans un B-arbre Une généralisation de l’insertion pour l’arbre 2-3. L’insertion se fait en deux étapes: Étape 1: ◦ Trouver le nœud où la valeur serait. ◦ S’il y a assez de place dans le nœud, insérer l’enregistrement à cet endroit. ◦ Sinon, diviser le nœud en deux, insérez la valeur à cet endroit, et promouvoir la valeur médiane dans le parent. Étape 2: ◦ Répéter l’étape 1 pour le parent si nécessaire. 124

125 Insertion dans un B-Arbre (suite) 10, 30, 50, 70, 90, 25, 40, 95, 45, 48 B-arbre d’ordre 6 125

126 Insertion dans un B-Arbre (suite) 10, 30, 50, 70, 90, 25, 40, 95, 45, 48 B-arbre d’ordre 6 10 126

127 Insertion dans un B-Arbre (suite) 10, 30, 50, 70, 90, 25, 40, 95, 45, 48 B-arbre d’ordre 6 10 30 127

128 Insertion dans un B-Arbre (suite) 10, 30, 50, 70, 90, 25, 40, 95, 45, 48 B-arbre d’ordre 6 10 3050 128

129 Insertion dans un B-Arbre (suite) 10, 30, 50, 70, 90, 25, 40, 95, 45, 48 B-arbre d’ordre 6 10 305070 129

130 Insertion dans un B-Arbre (suite) 10, 30, 50, 70, 90, 25, 40, 95, 45, 48 B-arbre d’ordre 6 10 305070 90 130

131 Insertion dans un B-Arbre (suite) 10, 30, 50, 70, 90, 25, 40, 95, 45, 48 B-arbre d’ordre 6 70 90 10 2530 50 131

132 Insertion dans un B-Arbre (suite) 10, 30, 50, 70, 90, 25, 40, 95, 45, 48 B-arbre d’ordre 6 70 90 10 253040 50 132

133 Insertion dans un B-Arbre (suite) 10, 30, 50, 70, 90, 25, 40, 95, 45, 48 B-arbre d’ordre 6 70 9095 10 253040 50 133

134 Insertion dans un B-Arbre (suite) 10, 30, 50, 70, 90, 25, 40, 95, 45, 48 B-arbre d’ordre 6 70 9095 10 253040 45 50 134

135 Insertion dans un B-Arbre (suite) 10, 30, 50, 70, 90, 25, 40, 95, 45, 48 B-arbre d’ordre 6 40 4548 10 25 30 50 70 9095 Fin ! 135

136 Insertion dans un B-arbre Ce processus d’insertion garanti que tous les nœuds internes sauf la racine sont au (m -1) / 2 plein. Exemple: ◦ Un B-arbre d’ordre 5 avec un nœud interne contenant 4 éléments. ◦ Ce nœud a 5 fils. ◦ Si un élément est promu à ce nœud interne, le nœud est divisé en deux nœuds qui contiendront chacun 2 éléments avec 3 fils. 136 70 9095100 70 90 95100

137 Suppression dans un B-arbre Deux stratégies pour la suppression: ◦ Localiser et supprimer l’élément, puis restructurer l’arbre. ◦ Descendre dans l’arbre et restructurer l’arbre en même temps de telle façon que lorsque l’élément est trouvé, il peut simplement être supprimé. ◦ Nous verrons le fonctionnement pour une variante du B Arbre qui est le B+ arbre 137

138 B-arbre - complexité MoyennePire cas Espace Recherche Insertion SuppressionO(n)O(log(n))O(log(n))O(log(n)) 138

139 LES B+ ARBRES 139

140 Introduction En pratique, la variante appelée B+ arbre est la plus utilisée. Quand de meilleures performances sont désirées, une variante appelée B* arbre peut être utilisée. Les B+ arbre: ◦ utilisés notamment dans HFS+ (Apple), NTFS et ReFS (Microsoft) et ext4 (Linux). ◦ une sorte de croisement entre B-arbres et index linéaires. 140

141 Introduction (suite) Nous avons vu précédemment le concept d’index linéaire. Lorsque les données sont statiques, utiliser la recherche binaire avec un index linéaire est très performant. Le problème majeur des index linéaire est comment gérer les insertions et suppressions. De plus un autre problème qui peut survenir est si l’index ne peut pas être stocké en mémoire vive. 141

142 Introduction (suite) Nous avions vu une solution qui est de construire un index linéaire à plusieurs niveaux (un index sur un index). Une autre idée serait de diviser l’index en plusieurs morceaux. Un bon choix serait de diviser selon la taille des blocs sur le disque ou un multiple de cette taille. Si un enregistrement doit être inséré, on peut l’insérer dans le bloc s’il reste de la place. Si les enregistrements dans un bloc doivent être un peu déplacé, ce n’est pas grave, car c’est toujours un accès disque pour un bloc. 142

143 Introduction (suite) Qu’est ce qu’on fait si un bloc est entièrement plein? On peut le diviser en deux. Pour la suppression? On peut supprimer l’enregistrement du bloc tout simplement. Toutefois, pour de meilleures performances, il est préférable d’avoir des blocs qui ne sont pas trop vide. Une solution est de fusionner des blocs adjacents après une suppression. Mais comment trouver un enregistrement? Une solution serait d’utiliser une structure en arbre…. 143

144 Introduction (suite) Ces idées ont mené aux B+ arbres. Un B+ arbre est un mécanisme pour gérer une liste triée séparés en morceaux. Les B+ arbres sont semblables aux B arbre, mais ne contiennent des enregistrements que dans les feuilles. En ce sens, les B+ arbres ressemblent aux index linéaires à plusieurs niveaux. 144

145 Les B+ arbres Dans un B+ arbre d’ordre m: Les nœuds internes stockent des paires utilisées pour guider la recherche. Les feuilles contiennent les enregistrements ou des pointeurs vers des enregistrements. Dépendant de la taille des enregistrements, une feuille peut contenir plus ou moins un maximum de m enregistrements (il est toutefois requis que les feuilles contiennent assez d’enregistrements pour être au moins à moitié pleines). 145

146 Les B+ arbres (suite) Les feuilles d’un B+ arbre sont généralement liées sous forme d’une liste doublement chaînée. Ceci permet de traverser en ordre séquentiel les enregistrements. Un B+ arbre d’ordre 4: Une liste doublement chaînée (rappel): tête queue 146

147 Les B+ arbres (suite) Classe abstraite pour les « Nœud » de l’arbre: 147

148 Recherche dans un B+ arbre La recherche dans un B+ arbre est effectuée essentiellement de la même façon que dans un B arbre, sauf que la recherche continue toujours jusqu’aux feuilles. Exemple: recherche de 33 >= < 148

149 Recherche dans un B+ arbre (suite) Pseudocode: 149

150 Recherche dans un B+ arbre (suite) Les B+ arbres sont très efficient pour la recherche par intervalle. Quand le premier enregistrement de l’intervalle est trouvé, les autres peuvent être accédés séquentiellement grâce à la liste chaînée. 150

151 Recherche dans un B+ arbre (suite) Illustration de la recherche par intervalle avec [17, 20] < < 151

152 Recherche dans un B+ arbre (suite) Illustration de la recherche par intervalle avec [17, 20] < < Quel est le coût en terme d’accès disque ? 152

153 Insertion dans un B+ arbre Étapes de l’insertion d’un enregistrement: Trouver la feuille qui devrait contenir l’enregistrement. Si la feuille n’est pas pleine, insérez l’enregistrement. Si la feuille est pleine, diviser la feuille en deux et promouvoir la clé la plus petite du nœud de droite. La promotion peut provoquer la division du nœud parent et ainsi de suite comme pour les B arbres. Si le nœud racine est divisé, cela entraîne la création d’un nouveau niveau dans l’arbre. 153

154 Insertion dans un B+ arbre (suite) L’insertion préserve la propriété de balancement (que toutes les feuilles soient au même niveau dans l’arbre). Pseudocode de l’insertion: 154

155 Insertion dans un B+ arbre (suite) Exemple d’insertion: Insérer 50 dans le B+ arbre avec des nœuds internes contenant maximum 3 clés et des feuilles de 5 clés. 155

156 Insertion dans un B+ arbre (suite) Exemple d’insertion: Après plusieurs autres insertions: On veut insérer la valeur 30 Cela produit la division de la feuille, puis la division de son parent. 156

157 Suppression dans un B+ arbre Étapes de la suppression: 1. localiser la feuille contenant l’enregistrement à supprimer. 2. Si la feuille est plus qu’à moitié pleine, alors supprimer l’enregistrement. 3. Si la feuille est seulement à moitié pleine, alors quelque chose doit être fait pour préserver la propriété que les nœuds sont toujours au moins à moitié plein. Stratégie  157

158 Suppression dans un B+ arbre (suite) Stratégie: ◦ consulter les feuilles adjacentes pour voir s’il est possible de transférer des enregistrements à partir de ces feuilles. ◦ si possible, alors un nombre d’enregistrements est transféré de façon à équilibrer le nombre d’enregistrements entre les deux feuilles. ◦ L’équilibrage vise à réduire la probabilité que le problème se répète éventuellement. ◦ Finalement, il peut être nécessaire de réajuster les clés du parent. 158

159 Suppression dans un B+ arbre (suite) Exemple 1: 18 est supprimé 159

160 Suppression dans un B+ arbre (suite) Exemple 1: 18 est supprimé Note: la clé 18 dans le nœud interne n’est pas supprimée. 160

161 Suppression dans un B+ arbre (suite) Exemple 2: 12 est supprimé de l’arbre suivant: L’élément 12 est supprimé, Maintenant, il faut tenter de déplacer des éléments d’une feuille adjacente, car la feuille n’est pas assez pleine. Quel élément ? 161

162 Suppression dans un B+ arbre (suite) Exemple 2: 12 est supprimé de l’arbre suivant: L’élément 18 a été déplacé. La clé du parent 18 a été remplacée par 19 pour quelle indique correctement les intervalles. 162

163 Suppression dans un B+ arbre (suite) Que se passe t-il si aucun nœud adjacent ne peut fournir d’enregistrement? Les enregistrements de la feuille courante sont transférés dans un des nœuds adjacents et la feuille courante est effacée. Cela est possible, car les nœuds adjacents sont au plus à moitié plein. Ce processus de fusion réduit le nombre de fils du parent et peut dont devoir être répété chez le parent. Si ce processus atteint la racine, alors l’arbre perd un niveau. 163

164 Suppression dans un B+ arbre (suite) Exemple 3: 33 est supprimé de l’arbre suivant: Après la suppression, il n’y a plus assez d’éléments. Comme il est impossible d’emprunter d’un nœud adjacent, il y a aura fusion 164

165 Suppression dans un B+ arbre (suite) Exemple 3: 33 est supprimé de l’arbre suivant: La fusion a été faite, mais le parent n’a qu’un seul fils! Puisque le parent n’a qu’un seul fils et que son voisin de gauche en a un en surplus, il y a déplacement. 165

166 Suppression dans un B+ arbre (suite) Pseudocode de la suppression: 166

167 B+ -arbre - complexité Coût Recherche O(log(n)) InsertionO(log(n)) SuppressionO(log(n)) La base du logarithme est le nombre de fils moyen. En pratique, les applications utilisent des valeurs comme 100, ce qui fait des arbres très peu profond. 167

168 Quelques observations Un B+ arbre d’ordre 100 avec un seul niveau peut avoir au maximum 100 enregistrements. Un B+ arbre d’ordre 100 avec 2 niveaux a au minimum 100 enregistrements et au maximum 10,000 (100 feuilles de 100 enrg.). Un B+ arbre d’ordre 100 avec 3 niveaux a au minimum 5000 enregistrements et au maximum 1 million. Un B+ arbre d’ordre 100 avec 4 niveaux a au minimum 250,000 et au maximum 100 millions d’enregistrements. 168

169 Quelques observations (suite) Pour un B+ arbre d’ordre 100, il est attendu qu’ environ 1 / 75 des nœuds soient des nœuds internes. Par conséquent la consommation mémoire des nœuds internes est faible. 169

170 Optimisations Stocker les deux plus hauts niveaux de l’arbre en mémoire vive améliore la performance et est possible, car ils sont généralement relativement petits. Ceci réduit le nombre d’accès disque. Une autre optimisation: utiliser un bassin de tampons. … 170

171 COMPARAISON B ARBRES ET B+ ARBRES 171

172 Complexité Complexité similaire pour opérations de base: ◦ espace O(n) ◦ recherche O(log(n)) ◦ insertion O(log(n)) ◦ suppression O(log(n)) 172

173 Stockage des enregistrements B+ arbre: ◦ seules les feuilles contiennent les enregistrements ou pointeurs vers les enregistrements. ◦ Les nœuds internes ne servent qu’à orienter la recherche. B arbre: ◦ tous les nœuds contiennent des enregistrements ou pointeurs vers des enregistrements Dans les deux cas, une feuille peut être un bloc (si stocké sur disque dur) 173

174 Stockage en mémoire vive Stockage en mémoire vive Stocker les niveaux du haut de l’arbre peut être réalisé plus facilement avec un B+ arbre car les nœuds internes ne contiennent que des clés et donc peuvent nécessiter moins de mémoire vive. 174

175 Liste chaînée Pour un B+ arbre, l’utilisation d’une liste chaînée permet de faire deux opérations plus simplement et de façon plus efficiente: ◦ lecture séquentielle ◦ recherche par intervalle. 175

176 Propriétés « moitié plein » B arbre: 1.tous les nœuds sont au moins à moitié plein. B+ arbre: 1.toutes les feuilles sont au moins à moitié pleine 2.tous les nœuds internes possèdent au moins la moitié du nb de fils maximal (sauf la racine qui doit en avoir >= 2) 176

177 La recherche B arbre: ◦ Un enregistrement (ou pointeur) peut être trouvé dans n’importe quel nœud de l’arbre B+ arbre: ◦ La recherche atteint toujours les feuilles, car les enregistrements (ou pointeurs) sont stockés dans les feuilles. 177

178 LE QUIZ 178

179 Questions 1. Dans quelle(s) situation(s), il serait préférable d’utiliser un B+ arbre plutôt que le hachage comme technique d’indexation? 2. Quel est l’avantage de stocker des clés dans les feuilles d’un B+ arbre plutôt que des enregistrements? 3. Quel est l’avantage de stocker des enregistrements dans les feuilles d’un B+ arbre plutôt que des clés? 4. Pourquoi est-t-il requis que les feuilles d‘un B+ arbre soient à moitié pleines? 179

180 Questions (suite) 5. Pourquoi un B arbre est généralement plus avantageux qu’un arbre 2-3 pour l’indexation sur disque? 6. Pourquoi un arbre binaire ne serait pas une bonne méthode d’indexation sur disque? 7. Quelle technique suggéreriez-vous d’utiliser pour la recherche par intervalle dans un fichier sur disque? 8. Dans quelles situations, il est utile d’utiliser une liste auto-organisée? 9. Dans quelle situations un vecteur de bits est une bonne technique pour l’indexation? 180

181 Questions (suite) 10. Pourquoi utiliser une liste chaînée au niveau des feuilles d’un B+ arbre? 181

182 Bibliographie Shaffer Clifford, A practical introduction to data structures and algorithm analysis, edition 3.2., chapitre 10. 182


Télécharger ppt "INFO 2014 Fichiers et base de données Philippe Fournier-Viger Département d’informatique, U.de Moncton Bureau D216,"

Présentations similaires


Annonces Google