Select Git revision
cours_23.md
Forked from
algorithmique / cours
424 commits behind the upstream repository.

orestis.malaspin authored
cours_23.md 6.43 KiB
- Rappel: Les B-arbres
- Pourquoi utiliser un B-arbre?
- À quoi ressemble un B-arbre?
- Qu'est-ce qu'un B-arbre d'ordre n
- Rappel: Les B-arbres
- Quelques propriétés
- Les B-arbres
- Exemple de recherche: trouver 32
- Les B-arbres
- La recherche de la clé C algorithme
- Les B-arbres
- Exercice: insérer 22, 45, 50, 5, 32, 55, 60, 41 dans l'arbre d'ordre 2
- Les B-arbres
- L'algorithme d'insertion
- Les B-arbres
- Pseudo-code structure de données (3min, matrix)?
- Les B-arbres
- Les fonctions utilitaires (5min matrix)
- Les B-arbres
- Les fonctions utilitaires (5min matrix)
- Les B-arbres
- Les fonctions (5min matrix)
- Les B-arbres
- Les fonctions
- Les B-arbres
- Les fonctions
- Les B-arbres
- Les fonctions (5min matrix)
- Les B-arbres
- Les fonctions (5min matrix)
- Les B-arbres
- Les fonctions (5min matrix)
- Les B-arbres: suppression
- Cas simplissime
title: "B-Arbres"
date: "2022-04-13"
patat:
eval:
tai:
command: fish
fragment: false
replace: true
ccc:
command: fish
fragment: false
replace: true
images:
backend: auto
Rappel: Les B-arbres
Pourquoi utiliser un B-arbre?
. . .
À quoi ressemble un B-arbre?
. . .
- Chaque page d'un arbre contient au plus clés;
- Chaque page (excepté la racine) contient au moins clés;
- Chaque page qui contient clés contient soit:
-
descendants;
-
descendants.
-
- Toutes les pages terminales apparaissent au même niveau.
Rappel: Les B-arbres
Quelques propriétés
- Dans chaque noeud les clés sont triées.
- Chaque page contient au plus nnoeuds: check;
- Chaque noeud avec mclés am+1descendants;
- Toutes les feuilles apparaissent au même niveau.
Les B-arbres
32
Exemple de recherche: trouver
. . .
- Si
n
plus petit que la 1e clé ou plus grand que la dernière descendre. - Sinon parcourir (par bissection ou séquentiellement) jusqu'à trouver ou descendre entre 2 éléments.
Les B-arbres
C
algorithme
La recherche de la clé - En partant de la racine.
- Si on est dans une feuille:
- Si la
C
est dans une page, retourner la page; - Sinon c'est perdu.
- Si la
- Sinon:
- Tant que
C > page
passer à la page suivante - Descendre
- Tant que
Les B-arbres
22, 45, 50, 5, 32, 55, 60, 41
dans l'arbre d'ordre 2
Exercice: insérer
. . .
Les B-arbres
L'algorithme d'insertion
- Rechercher la feuille (la page a aucun enfant) où insérer;
- Si la page n'est pas pleine insérer dans l'ordre croissant.
- Si la page est pleine:
- On décale les éléments plus grand que
N
; - On insère
N
dans la place "vide"; - 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 deM
avec l'ancienne et la nouvelle page respectivement.
- On décale les éléments plus grand que
Les B-arbres
Pseudo-code structure de données (3min, matrix)?
. . .
struct page
entier ordre, nb
element tab[2*ordre + 2]
struct element
int clé
page pg
Les B-arbres
\footnotesize
Les fonctions utilitaires (5min matrix)
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
. . .
booléen est_feuille(page)
retourne (page.tab[0] == vide)
entier position(page, valeur)
i = 0
tant que i < page.nb && val >= page.tab[i]
i += 1
retourne i
booléen est_dans_page(page, valeur)
i = position(page, valeur)
retourne (i > 0 && page.tab[i] == valeur)
Les B-arbres
\footnotesize
Les fonctions utilitaires (5min matrix)
page nouvelle_page(ordre) // creer une page
rien liberer_memoire(page) // liberer tout un arbre!
. . .
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)
page recherche(page, valeur) // retourner la page contenant
// la valeur ou vide
. . .
page recherche(page, valeur)
si est_dans_page(page, valeur)
retourne page
sinon si est_feuille(page) && !est_dans_page(page, valeur)
retourne vide
sinon
recherche(page.tab[position(page, valeur)], valeur)
Les B-arbres
Les fonctions
page inserer(page, valeur) // inserer une valeur
. . .
page inserer(page, valeur)
element = nouvel_element(valeur)
inserer_element(page, element) // on change elmement pour savoir s'il faut le remonter
si element.page != vide
page = ajouter_niveau(page, element) // si on atteint le sommet!
retourne page
Les B-arbres
Les fonctions
rien inserer_element(page, element) // inserer un element et voir s'il remonte
. . .
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)
si element.page != vide
placer(page, element)
Les B-arbres
Les fonctions (5min matrix)
rien placer(page, element) // inserer un élément
. . .
rien placer(page, element)
i = position(page, element.clé)
pour i de 2*page.ordre à i+1
page.tab[i+1] = page.tab[i]
page.tab[i+1] = element
page.nb += 1
si page.nb > 2*page.ordre
scinder(page, element)
Les B-arbres
Les fonctions (5min matrix)
rien scinder(page, element) // casser une page et remonter
. . .
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)
page ajouter_niveau(page, element) // si on remonte à la racine...
// on doit créer une nouvelle racine
. . .
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: suppression
Cas simplissime
. . .