Skip to content
Snippets Groups Projects

Pk

Merged Pk
4 unresolved threads
Merged pierre.kunzli requested to merge pk into master
4 unresolved threads
+ 20
12
@@ -127,15 +127,17 @@ booléen est_dans_page(page, valeur) // la valeur est dans la page
@@ -127,15 +127,17 @@ booléen est_dans_page(page, valeur) // la valeur est dans la page
```C
```C
booléen est_feuille(page)
booléen est_feuille(page)
retourne (page.tab[0] == vide)
retourne (page.tab[0].pg == vide)
 
entier position(page, valeur)
entier position(page, valeur)
i = 0
i = 0
tant que i < page.nb && val >= page.tab[i]
tant que i < page.nb && val >= page.tab[i+1].clef
i += 1
i += 1
retourne i
retourne i
 
booléen est_dans_page(page, valeur)
booléen est_dans_page(page, valeur)
i = position(page, valeur)
i = position(page, valeur)
retourne (i > 0 && page.tab[i] == valeur)
retourne (page.nb > 0 && page.tab[i].clef == valeur)
```
```
# Les B-arbres
# Les B-arbres
@@ -157,6 +159,7 @@ page nouvelle_page(ordre)
@@ -157,6 +159,7 @@ page nouvelle_page(ordre)
page.nb = 0
page.nb = 0
page.tab = allouer(2*ordre+2)
page.tab = allouer(2*ordre+2)
retourner page
retourner page
 
rien liberer_memoire(page)
rien liberer_memoire(page)
si est_feuille(page)
si est_feuille(page)
liberer(page.tab)
liberer(page.tab)
@@ -183,7 +186,7 @@ page recherche(page, valeur) // retourner la page contenant
@@ -183,7 +186,7 @@ page recherche(page, valeur) // retourner la page contenant
page recherche(page, valeur)
page recherche(page, valeur)
si est_dans_page(page, valeur)
si est_dans_page(page, valeur)
retourne page
retourne page
sinon si est_feuille(page) && !est_dans_page(page, valeur)
sinon si est_feuille(page)
retourne vide
retourne vide
sinon
sinon
recherche(page.tab[position(page, valeur)], valeur)
recherche(page.tab[position(page, valeur)], valeur)
@@ -202,9 +205,11 @@ page inserer(page, valeur) // inserer une valeur
@@ -202,9 +205,11 @@ page inserer(page, valeur) // inserer une valeur
```C
```C
page inserer(page, valeur)
page inserer(page, valeur)
element = nouvel_element(valeur)
element = nouvel_element(valeur)
inserer_element(page, element) // on change elmement pour savoir s'il faut le remonter
// on change element pour savoir s'il faut le remonter
si element.page != vide
inserer_element(page, element)
page = ajouter_niveau(page, element) // si on atteint le sommet!
si element != vide && element.page != vide
Please register or sign in to reply
 
// si on atteint le sommet
 
page = ajouter_niveau(page, element)
retourne page
retourne page
```
```
@@ -213,7 +218,8 @@ page inserer(page, valeur)
@@ -213,7 +218,8 @@ page inserer(page, valeur)
## Les fonctions
## Les fonctions
```C
```C
rien inserer_element(page, element) // inserer un element et voir s'il remonte
// inserer un element et voir s'il remonte
 
rien inserer_element(page, element)
```
```
. . .
. . .
@@ -225,7 +231,7 @@ rien inserer_element(page, element)
@@ -225,7 +231,7 @@ rien inserer_element(page, element)
sinon
sinon
sous_page = page.tab[position(page, element)].page
sous_page = page.tab[position(page, element)].page
inserer_element(sous_page, element)
inserer_element(sous_page, element)
si element.page != vide
si element != vide && element.page != vide
Please register or sign in to reply
placer(page, element)
placer(page, element)
```
```
@@ -241,13 +247,15 @@ rien placer(page, element) // inserer un élément
@@ -241,13 +247,15 @@ rien placer(page, element) // inserer un élément
```C
```C
rien placer(page, element)
rien placer(page, element)
i = position(page, element.clé)
i = position(page, element.clef)
pour i de 2*page.ordre à i+1
pour i de 2*page.ordre à i+1
page.tab[i+1] = page.tab[i]
page.tab[i+1] = page.tab[i]
page.tab[i+1] = element
page.tab[i+1] = element
page.nb += 1
page.nb += 1
si page.nb > 2*page.ordre
si page.nb > 2*page.ordre
scinder(page, element)
scinder(page, element)
 
sinon
    • je me dis que rien faire c'est ok. on veut pas tuer l'élément...

      • C'est pas pour tuer l'élément, c'est que sinon on aura un appel à placer dans tout les retours récursifs après inserer_element dans inserer_element ... vois tu ce que je veux dire ?

      • Alors qu'une fois qu'un "placer" se fait sans scinder, faut pas refaire des placer plus haut dans l'arbre. Ou ça se fait par un autre moyen ?

      • ah non mais je suis con comme un balais. il manque un

        si est_dans_page(page, element.clef)
            retourne

        dans placer. Ensuite je pense que c'est ok. Comme ça on modifie pas l'argument de placer. Tu en dis quoi?

        Edited by orestis.malaspin
      • Baaa pas sur. Il y a des appels recursifs à inserer_element qui vont aboutir sur un placer. Dans ce placer, il se peut qu'on scinde et qu'on se retrouve avec un element.page != vide (élément promu). Il faut alors le placer après le retour de inserer_element. Mais pour les autres appels à inserer_element qui restent empilés ? il faut leur signaler qu'il ne faut pas faire de placer (element va pointer sur l'élément qui a été promu plus bas dans l'arbre).

      • Please register or sign in to reply
Please register or sign in to reply
 
element = vide
```
```
# Les B-arbres
# Les B-arbres
@@ -266,7 +274,7 @@ rien scinder(page, element)
@@ -266,7 +274,7 @@ rien scinder(page, element)
new_page.nb = page.ordre
new_page.nb = page.ordre
pour i de 0 à ordre inclu
pour i de 0 à ordre inclu
new_page.tab[i] = page.tab[i+ordre+1]
new_page.tab[i] = page.tab[i+ordre+1]
element.clé = page.tab[ordre+1].clé
element.clef = page.tab[ordre+1].clé
element.page = new_page
element.page = new_page
```
```
@@ -285,7 +293,7 @@ page ajouter_niveau(page, element) // si on remonte à la racine...
@@ -285,7 +293,7 @@ page ajouter_niveau(page, element) // si on remonte à la racine...
page ajouter_niveau(page, element)
page ajouter_niveau(page, element)
tmp = nouvelle_page(page.ordre)
tmp = nouvelle_page(page.ordre)
tmp.tab[0].page = page
tmp.tab[0].page = page
tmp.tab[1].clé = element.clé
tmp.tab[1].clef = element.clef
tmp.tab[1].page = element.page
tmp.tab[1].page = element.page
retourne tmp
retourne tmp
```
```
Loading