4/25/2017 4:30 PM Arbres (2,4) 9 2 5 7 10 14 CSI2510 CSI2510
Arbres (2,4) Arbres de recherche généralisés (Multi-way search tree) 4/25/2017 4:30 PM Arbres (2,4) Arbres de recherche généralisés (Multi-way search tree) Définition Recherche Arbres (2,4) Insertion Suppression CSI2510 CSI2510
Arbre de recherche multi-branches 4/25/2017 4:30 PM Un arbre de recherche généralisé (ou arbre de recherche m-aire) est un arbre ordonné tel que: Chaque nœud interne a au moins deux enfants et emmagasine d -1 entrées clé-élément (ki, oi), où d est le nombre des enfants de a Un nœud ayant comme enfants v1 v2 … vd emmagasine les clés k1 k2 … kd-1 de telle façon que: Les clés dans le sous-arbre v1 sont inférieures à k1 Les clés dans le sous-arbre vi sont comprises entre ki-1 et ki (i = 2, …, d - 1) Les clés dans le sous-arbre vd sont supérieures à kd-1 Les feuilles n’emmagasinent aucune clé 11 24 2 6 8 15 27 32 30 CSI2510 CSI2510
Parcours infixe de l’arbre généralisé de recherche 4/25/2017 4:30 PM Cas particulier avec d=2: arbre de recherche binaire Extension du parcours infixe des arbres binaires Nous visitons l’entrée (ki, oi) du nœud v entre les traversées récursive des sous-arbres de v enracinés aux enfants vi et vi + 1 La parcours infixe d’un arbre de recherche généralisé visite les clés dans l’ordre croissant 11 24 8 12 2 6 8 15 27 32 2 4 6 10 14 18 30 1 3 5 7 9 11 13 16 19 15 17 CSI2510 CSI2510
Recherche dans un arbre de recherche généralisé 4/25/2017 4:30 PM Semblable à la recherche dans les arbres de recherche binaires Pour chaque nœud interne d’enfants v1 v2 … vd et emmagasinant les clés k1 k2 … kd-1 k = ki (i = 1, …, d - 1): la recherche est accomplie avec succès k < k1: nous continuons la recherche dans le sous-arbre enfant v1 ki-1 < k < ki (i = 2, …, d - 1): nous continuons la recherche dans le sous-arbre enfant vi k > kd-1: nous continuons la recherche dans l’enfant vd Si un nœud externe est atteint, la recherche échoue Exemple: chercher 30 11 24 2 6 8 15 27 32 30 CSI2510 CSI2510
Arbre (2,4) 4/25/2017 4:30 PM un arbre (2,4) (appelé aussi arbre 2-4 ou arbre 2-3-4) est un arbre de recherche généralisé qui satisfait les propriétés suivantes: Propriétés de taille des nœuds: chaque nœud interne a au maximum quatre enfants et au minimum 2 enfants Propriétés de profondeur: tous les nœuds externes ont la même profondeur Un nœud interne d’un arbre (2,4) est nommé un 2-nœud, 3-nœud ou 4-nœud suivant le nombre de ses enfants 10 15 24 2 8 12 18 27 32 CSI2510 CSI2510
Hauteur d’un arbre (2,4) 4/25/2017 4:30 PM Théorème: un arbre (2,4) emmagasinant n entrées a une hauteur O(log n) : Soit h la hauteur d’un arbre (2,4) avec n entrées Comme il y a au moins 2i entrées à la profondeur i = 0, … , h - 1 et aucune entrée à la profondeur h, nous avons: n 1 + 2 + 4 + … + 2h-1 = 2h - 1 Alors, h log (n + 1) La recherche dans un arbre (2,4) avec n entrées prend un temps O(log n) profondeur elements 1 1 2 h-1 2h-1 h CSI2510 CSI2510
Hauteur d’un arbre (2,4) 4/25/2017 4:30 PM Quand tous les nœuds internes ont 1 clé et 2 enfants arbre binaire parfait: n = 2h-1 h = O(log n) # min. d’entrées, n: Quand tous les nœuds internes ont 3 clés et 4 enfants n = 3* 4i =3* # clés = 4h-1 h = O(log4 n) Rechercher = O( log n ) h-1 # max. d’entrées, n: (4h-1) 4-1 i=0 CSI2510 CSI2510
Insertion 4/25/2017 4:30 PM nous insérons une nouvelle entrée (k, o) dans le nœud parent v de la feuille atteinte en recherchant k Nous conservons la propriété de profondeur mais… Nous pouvons causer un débordement (overflow) (c.-à-d., le nœud v peut devenir un 5-nœud) Exemple: insertion d’une clé 30 cause un débordement 10 15 24 v 2 8 12 18 27 32 35 10 15 24 v 2 8 12 18 27 30 32 35 CSI2510 CSI2510
Débordement et fractionnement 4/25/2017 4:30 PM 10 15 24 10 15 24 32 au parent 35 27 30 32 35 27 30 10 15 24 32 Overflow ! 27 30 35 CSI2510 CSI2510
Débordement et fractionnement 4/25/2017 4:30 PM 24 au parent 10 15 24 32 27 30 35 32 10 15 24 10 15 32 2 8 12 18 27 30 35 CSI2510 CSI2510
Débordement et fractionnement 4/25/2017 4:30 PM Nous contrôlons un débordement (overflow) à un nœud v avec une opération de fractionnement (ou séparation-split): Soit v1 … v5 les enfants de v et k1 … k4 les clés de v nœud v est remplacé par deux nœuds v' et v" tel que: v' est un 3-nœud avec les clés k1 k2 et les enfants v1 v2 v3 v" est un 2-nœud avec une clé k4 et les enfants v4 v5 La clé k3 est insérée dans le parent u de v (une nouvelle racine peut être créée) Le débordement peut se propager au parent du nœud u u u 15 24 15 24 32 v v' v" 12 18 27 30 32 35 12 18 27 30 35 v1 v2 v3 v4 v5 v1 v2 v3 v4 v5 CSI2510 CSI2510
Analyse d’insertion (en remontant) 4/25/2017 4:30 PM Soit T un arbre (2,4) avec n entrées: L’arbre T a une hauteur O(log n) L’étape 1 prend un temps O(log n) parce que nous visitons O(log n) nœuds L’étape 2 prend un temps O(1) L’étape 3 prend un temps O(log n) parce que chaque séparation prends un temps O(1) et nous effectuons O(log n) séparations au max. Alors, une insertion dans un arbre (2,4) prends un temps O(log n) Algorithm insertItem(k, o) Nous cherchons une clé k pour localiser le nœud d'insertion v 2. Nous ajoutons le nouvel item (k, o) au noeud v 3. while overflow(v) if isRoot(v) Créer une nouvelle racine vide au dessus de v v split(v) CSI2510 CSI2510
Suppression 4/25/2017 4:30 PM Il suffit de considérer les cas où la clé à supprimer est dans un nœud avec des enfants feuilles Sinon, nous remplaçons l’entrée avec son successeur (ou prédécesseur) dans le parcours infixe et nous enlèverons cette dernière entrée Exemple: pour enlever la clé 24, nous la remplaçons par la clé 27 (son successeur en parcours infixe ) 27 32 35 10 15 24 2 8 12 18 10 15 27 2 8 12 18 32 35 CSI2510 CSI2510
Underflow et Fusion u u w v v' 4/25/2017 4:30 PM La suppression d’une entrée d’un nœud v peut causer un underflow où le nœud v devient un 1-nœud avec un enfant et aucune clé Pour contrôler un underflow au nœud v de parent u, nous considérons deux cas Cas 1: Les 2 frères adjacents de v sont des 2-nœud ou v possède un seul frère adjacent qui est 2-noeud: Fusion : fusionner v avec un frère adjacent w et déplacer une entrée de u dans le nœud fusionné v' Après la fusion, l’underflow peut se propager au parent u Si l’underflow se produit à la racine, alors le parent et les deux enfants deviennent un 3-noeud u u 9 14 9 w v v' 2 5 7 10 2 5 7 10 14 CSI2510 CSI2510
Underflow et transfert 4/25/2017 4:30 PM Pour contrôler un underflow au nœud v de parent u, nous considérons deux cas Cas 2: un frère adjacent w de v est un 3-nœud ou un 4-nœud Transfert: 1. déplacer un enfant de w dans v 2. déplacer une entrée de w dans u 3. déplacer une entrée de u dans v Après le transfert, plus d’underflow possible u u 4 9 4 8 w v w v 2 6 8 2 6 9 CSI2510 CSI2510
Analyse de suppression (en remontant) 4/25/2017 4:30 PM Soit T un arbre (2,4) avec n entrées Un arbre T a une hauteur O(log n) Lors d’une suppression Nous visitons O(log n) nœuds pour localiser le nœud dans lequel aura lieu la suppression Nous résolvons l’underflow avec une série de O(log n) fusions au max., suivie d’un transfert dans le pire des cas Chaque fusion ou transfert prend un temps O(1) Alors, la suppression d’une entrée d’un arbre (2,4) prend un temps O(log n) CSI2510 CSI2510
Insertion et suppression en descendant Il est aussi possible d’effectuer l’insertion en descendant Chaque fois qu’un 4-nœud est rencontré lors de la descente, celui-ci est éclaté. Si c’est la racine, elle est éclaté en trois 2-nœuds. Sinon, son parent est forcément un 2-nœud ou un 3-nœud Pour effectuer la suppression en descendant: On s’arrange pour que l’élément à supprimer soit un 3-nœud ou un 4-nœud (sauf pour la racine) Si les 2 enfants de l’élément supprimé sont 2-nœud, alors on les fusionne Sinon, on remplace par successeur infixe Donc, chaque fois que je rencontre un 2-nœud, celui-ci est transformé en un 3-nœud Si mon frère est un 3-nœud ou un 4-nœud, je vais lui chercher un élément Si mon frère est un 2-nœud, alors je dois aller chercher un élément en le prenant au parent qui sera forcement un 3-nœud ou un 4-nœud et je forme un 4-noeud A moins que le parent soit la racine, je créé alors un 4-noeud CSI2510
Exemple Insérer Retirer 10,5,8,7,15,20,12,9,13,22,16,24 8,7,10,16,20 CSI2510