From deb1a6a80ad382dbbf6738b06f28579143ef9e83 Mon Sep 17 00:00:00 2001 From: Orestis <orestis.malaspinas@pm.me> Date: Thu, 18 May 2023 19:13:44 +0200 Subject: [PATCH] removed content not covered --- slides/cours_21.md | 309 --------------------------------------------- 1 file changed, 309 deletions(-) diff --git a/slides/cours_21.md b/slides/cours_21.md index e1aa620..c3967a0 100644 --- a/slides/cours_21.md +++ b/slides/cours_21.md @@ -729,312 +729,3 @@ rien maj_force_sur_etoile(arbre, e, theta) * Insérer 20, 40, 10, 30, 15, 35, 7, 26, 18, 22, 5, 42, 13, 46, 27, 8, 32, 38, 24, 45, 25, 2, 14, 28, 32, 41, * Dans un B-arbre d'ordre 2. -# Les B-arbres - -## Structure de données - -* Chaque page a une contrainte de remplissage, par rapport à l'ordre de l'arbre; -* Un nœud (page) est composé d'un tableau de clés/pointeurs vers les enfants; - -``` -P_0 | K_1 | P_1 | K_2 | | P_i | K_{i+1} | | P_{m-1} | K_m | P_m -``` - -* `P_0`, ..., `P_m` pointeurs vers enfants; -* `K_1`, ..., `K_m` les clés. -* Il y a `m+1` pointeurs mais `m` clés. -* Comment faire pour gérer l'insertion? - -# Les B-arbres - -## Faire un dessin de la structure de données (3min matrix)? - -. . . - - - -1. On veut un tableau de `P_i, K_i => struct`; -2. `K_0` va être en "trop"; -3. Pour simplifier l'insertion dans une page, on ajoute un élément de plus. - -# Les B-arbres - -## L'insertion cas nœud pas plein, insertion `4`? - -{width=50%} - -. . . - -## Solution - -{width=50%} - -# Les B-arbres - -## L'insertion cas nœud pas plein, insertion `N` - -* On décale les éléments plus grand que `N`; -* On insère `N` dans la place "vide"; -* Si la page n'est pas pleine, on a terminé. - -# Les B-arbres - -## L'insertion cas nœud plein, insertion `2`? - -{width=50%} - -. . . - -## Solution - -{width=50%} - -# Les B-arbres - -## L'insertion cas nœud plein, promotion `3`? - -{width=50%} - -. . . - -## Solution - - - -# Les B-arbres - -## L'insertion cas nœud plein, insertion `N` - -* On décale les éléments plus grand que `N`; -* On insère `N` dans la place "vide"; -* Si la page est pleine: - * On trouve la valeur médiane `M` de la page (quel indice?); - * On crée une nouvelle page de droite; - * On copie les valeur à droite de `M` dans la nouvelle page; - * On promeut `M` dans la page du dessus; - * On connecte le pointeur de gauche de `M` et de droite de `M` avec l'ancienne et la nouvelle page respectivement. - -# Les B-arbres - -## Pseudo-code structure de données (3min, matrix)? - -. . . - -```C -struct page - entier ordre, nb - element tab[2*ordre + 2] -``` - -```C -struct element - int clé - page pg -``` - -# Les B-arbres - -\footnotesize - -## Les fonctions utilitaires (5min matrix) - -```C -booléen est_feuille(page) // la page est elle une feuille? -entier position(page, valeur) // à quelle indice on insère? -booléen est_dans_page(page, valeur) // la valeur est dans la page -``` - -. . . - -```C -booléen est_feuille(page) - retourne (page.tab[0].pg == vide) - -entier position(page, valeur) - i = 0 - tant que i < page.nb && val >= page.tab[i+1].clef - i += 1 - retourne i - -booléen est_dans_page(page, valeur) - i = position(page, valeur) - retourne (page.nb > 0 && page.tab[i].val == valeur) -``` - -# Les B-arbres - -\footnotesize - -## Les fonctions utilitaires (5min matrix) - -```C -page nouvelle_page(ordre) // creer une page -rien liberer_memoire(page) // liberer tout un arbre! -``` -. . . - -```C -page nouvelle_page(ordre) - page = allouer(page) - page.ordre = ordre - page.nb = 0 - page.tab = allouer(2*ordre+2) - retourner page - -rien liberer_memoire(page) - si est_feuille(page) - liberer(page.tab) - liberer(page) - sinon - pour fille dans page.tab - liberer_memoire(fille) - liberer(page.tab) - liberer(page) -``` - -# Les B-arbres - -## Les fonctions (5min matrix) - -```C -page recherche(page, valeur) // retourner la page contenant - // la valeur ou vide -``` - -. . . - -```C -page recherche(page, valeur) - si est_dans_page(page, valeur) - retourne page - sinon si est_feuille(page) - retourne vide - sinon - recherche(page.tab[position(page, valeur)], valeur) -``` - -# Les B-arbres - -## Les fonctions - -```C -page inserer_valeur(page, valeur) // inserer une valeur -``` - -. . . - -```C -page inserer_valeur(page, valeur) - element = nouvel_element(valeur) - // on change element pour savoir s'il faut le remonter - inserer_element(page, element) - si element.page != vide && page.nb > 2*page.ordre - // si on atteint le sommet! - page = ajouter_niveau(page, element) - retourne page -``` - -# Les B-arbres - -## Les fonctions - -```C -rien inserer_element(page, element) // inserer un element et voir s'il remonte -``` - -. . . - -```C -rien inserer_element(page, element) - si est_feuille(page) - placer(page, element) - sinon - sous_page = page.tab[position(page, element)].page - inserer_element(sous_page, element) - // un element a été promu - si element.page != vide - placer(page, element) -``` - -# Les B-arbres - -## Les fonctions (5min matrix) - -```C -rien placer(page, element) // inserer un élément -``` - -. . . - -```C -rien placer(page, element) - pos = position(page, element.clé) - pour i de 2*page.ordre à pos+1 - page.tab[i+1] = page.tab[i] - page.tab[pos+1] = element - page.nb += 1 - si page.nb > 2*page.ordre - scinder(page, element) -``` - -# Les B-arbres - -## Les fonctions (5min matrix) - -```C -rien scinder(page, element) // casser une page et remonter -``` - -. . . - -```C -rien scinder(page, element) - new_page = new_page(page.ordre) - new_page.nb = page.ordre - pour i de 0 à ordre inclu - new_page.tab[i] = page.tab[i+ordre+1] - element.clé = page.tab[ordre+1].clé - element.page = new_page -``` - -# Les B-arbres - -## Les fonctions (5min matrix) - -```C -page ajouter_niveau(page, element) // si on remonte à la racine... - // on doit créer une nouvelle racine -``` - -. . . - -```C -page ajouter_niveau(page, element) - tmp = nouvelle_page(page.ordre) - tmp.tab[0].page = page - tmp.tab[1].clé = element.clé - tmp.tab[1].page = element.page - retourne tmp -``` - - -<!-- # Les B-arbres --> - -<!-- ## Structure de données en C (3min, matrix) --> - -<!-- . . . --> - -<!-- ```C --> -<!-- typedef struct _page { --> -<!-- int order, nb; --> -<!-- struct _element *tab; --> -<!-- } page; --> -<!-- ``` --> - -<!-- ```C --> -<!-- typedef struct element { --> -<!-- int key; --> -<!-- struct _page *pg; --> -<!-- } element; --> -<!-- ``` --> - -- GitLab