Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
C
cours
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
jacquesw.ndoumben
cours
Commits
67bd9a84
Verified
Commit
67bd9a84
authored
1 year ago
by
orestis.malaspin
Browse files
Options
Downloads
Patches
Plain Diff
updaet 2024
parent
cebde3ff
Branches
Branches containing commit
No related tags found
No related merge requests found
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
slides/cours_18.md
+0
-528
0 additions, 528 deletions
slides/cours_18.md
slides/cours_19.md
+1235
-0
1235 additions, 0 deletions
slides/cours_19.md
with
1235 additions
and
528 deletions
slides/cours_18.md
+
0
−
528
View file @
67bd9a84
...
@@ -1187,533 +1187,5 @@ int right(int i) {
...
@@ -1187,533 +1187,5 @@ int right(int i) {
```
-->
```
-->
# Complexités
::: columns
:::: column
## Complexité de la recherche
1.
En moyenne?
2.
Dans le pire des cas?
. . .
1.
$O(
\l
og_2(N))$
2.
$O(N)$
::::
:::: column
```
{.mermaid format=pdf width=400 loc=figs/}
graph TD;
id0((10))-->id1((9));
id0-->id8(( ));
id1-->id2((7));
id1-->id9(( ));
id2-->id3((6));
id2-->id10(( ));
id3-->id4((5));
id3-->id11(( ));
style id8 fill:#fff,stroke:#fff
style id9 fill:#fff,stroke:#fff
style id10 fill:#fff,stroke:#fff
style id11 fill:#fff,stroke:#fff
```
::::
:::
# Un meilleur arbre
*
Quelle propriété doit satisfaire un arbre pour être $O(
\l
og_2(N))$?
. . .
*
Si on a environ le même nombre de nœuds dans les sous-arbres.
## Définition
Un arbre binaire est parfaitement équilibré si, pour chaque
nœud, la différence entre les nombres de nœuds des sous-
arbres gauche et droit vaut au plus 1.
*
Si l'arbre est
**parfaitement équilibré**
, alors tout ira bien.
*
Quelle est la hauteur (profondeur) d'un arbre parfaitement équilibré?
. . .
*
$O(
\l
og_2(N))$.
# Équilibre parfait ou pas?
::: columns
:::: column
```
{.mermaid format=pdf width=400 loc=figs/}
graph TD;
id0((W))-->id1((B));
id0-->id8((Y));
id1-->id2((A));
id1-->id9(( ));
id8-->id10((X));
id8-->id11(( ));
style id9 fill:#fff,stroke:#fff
style id11 fill:#fff,stroke:#fff
```
::::
:::: column
. . .
```
É
Q
U
I
L
I
B
R
É
```
::::
:::
# Équilibre parfait ou pas?
::: columns
:::: column
```
{.mermaid format=pdf width=400 loc=figs/}
graph TD;
id0((16))-->id1((10));
id0-->id2((19));
id1-->id3((8));
id1-->id4((12));
id4-->id5((11));
id4-->id6(( ));
id2-->id7((17));
id2-->id8(( ));
id7-->id9(( ));
id7-->id10((18));
style id6 fill:#fff,stroke:#fff
style id8 fill:#fff,stroke:#fff
style id9 fill:#fff,stroke:#fff
```
::::
:::: column
. . .
```
P
A
S
É
Q
U
I
L
I
B
R
É
```
::::
:::
# Arbres AVL
\f
ootnotesize
*
Quand est-ce qu'on équilibre un arbre?
. . .
*
A l'insertion/suppression.
*
Maintenir un arbre en état d'équilibre parfait: cher (insertion, suppression).
*
On peut "relaxer" la condition d'équilibre: profondeur (hauteur) au lieu du
nombre de nœuds:
*
La hauteur $
\s
im
\l
og_2(N)$.
## Définition
Un arbre AVL (Adelson-Velskii et Landis) est un arbre binaire de recherche dans
lequel, pour chaque nœud, la différence de hauteur entre le sous-arbre gauche et droit vaut au plus 1.
*
Relation entre nœuds et hauteur:
$$
\l
og_2(1+N)
\l
eq 1+H
\l
eq 1.44
\c
dot
\l
og_2(2+N),
\q
uad N=10^5,
\
17
\l
eq H
\l
eq 25.
$$
*
Permet l'équilibrage en temps constant: insertion/suppression $O(
\l
og_2(N))$.
# Notation
*
`hg`
: hauteur du sous-arbre gauche.
*
`hd`
: hauteur du sous-arbre droit.
*
`facteur d'équilibre = fe = hd - hg`
*
Que vaut
`fe`
si l'arbre est AVL?
. . .
*
`fe = {-1, 0, 1}`
# AVL ou pas?
::: columns
:::: column
```
{.mermaid format=pdf width=400 loc=figs/}
graph TD;
id0((12))-->id1((10));
id0-->id2((19));
id2-->id3((17));
id2-->id4((97));
```
::::
:::: column
. . .
```
A
V
L
```
::::
:::
# AVL ou pas?
::: columns
:::: column
```
{.mermaid format=pdf width=400 loc=figs/}
graph TD;
id0((12))-->id1((1));
id0-->id2((19));
id2-->id3((17));
id2-->id4((97));
id4-->id5((37));
id4-->id6(( ));
style id6 fill:#fff,stroke:#fff
```
::::
:::: column
. . .
```
P
A
S
A
V
L
```
::::
:::
# Insertion dans un arbre AVL (1/N)
1.
On part d'un arbre AVL.
2.
On insère un nouvel élément.
::: columns
:::: column
*
`hd ? hg`
.
*
Insertion de
`4`
?
```
{.mermaid format=pdf width=400 loc=figs/}
graph TD;
id0((12))-->id1((1));
id0-->id2((19));
```
::::
:::: column
. . .
*
`hd = hg`
```
{.mermaid format=pdf width=400 loc=figs/}
graph TD;
id0((12))-->id1((1));
id0-->id2((19));
id1-->id4(( ));
id1-->id5((4));
style id4 fill:#fff,stroke:#fff
```
*
`fe = -1`
::::
:::
# Insertion dans un arbre AVL (2/N)
1.
On part d'un arbre AVL.
2.
On insère un nouvel élément.
::: columns
:::: column
*
`hd ? hg`
.
*
Insertion de
`4`
?
```
{.mermaid format=pdf width=400 loc=figs/}
graph TD;
id0((12))-->id1((1));
id0-->id2((19));
id2-->id3((18));
id2-->id4(( ));
style id4 fill:#fff,stroke:#fff
```
::::
:::: column
. . .
*
`hd < hg`
```
{.mermaid format=pdf width=400 loc=figs/}
graph TD;
id0((12))-->id1((1));
id0-->id2((19));
id2-->id3((18));
id2-->id4(( ));
id1-->id5(( ));
id1-->id6((4));
style id4 fill:#fff,stroke:#fff
style id5 fill:#fff,stroke:#fff
```
*
`fe = 0`
::::
:::
# Insertion dans un arbre AVL (3/N)
\f
ootnotesize
1.
On part d'un arbre AVL.
2.
On insère un nouvel élément.
::: columns
:::: column
*
`hd ? hg`
.
*
Insertion de
`4`
?
```
{.mermaid format=pdf width=400 loc=figs/}
graph TD;
id0((12))-->id1((1));
id0-->id2((19));
id1-->id3(( ));
id1-->id4((6));
id2-->id5(( ));
id2-->id6(( ));
style id3 fill:#fff,stroke:#fff
style id5 fill:#fff,stroke:#fff
style id6 fill:#fff,stroke:#fff
```
::::
:::: column
. . .
*
`hd < hg`
```
{.mermaid format=pdf width=400 loc=figs/}
graph TD;
id0((12))-->id1((1));
id0-->id2((19));
id1-->id3(( ));
id1-->id4((6));
id4-->id5((4));
id4-->id6(( ));
id2-->id7(( ));
id2-->id8(( ));
style id3 fill:#fff,stroke:#fff
style id6 fill:#fff,stroke:#fff
style id7 fill:#fff,stroke:#fff
style id8 fill:#fff,stroke:#fff
```
::::
:::
**Déséquilibre!**
Que vaut
`fe`
?
. . .
*
`fe = 2`
# Les cas de déséquilibre
::: columns
:::: column
## Cas 1a
*
`u`
,
`v`
,
`w`
même hauteur.
*
déséquilibre en
`B`
après insertion dans
`u`

::::
:::: column
## Cas 1a
*
Comment rééquilibrer?
. . .
*
ramène
`u`
,
`v`
`w`
à la même hauteur.
*
`v`
à droite de
`A`
(gauche de
`B`
)

::::
:::
# Les cas de déséquilibre
::: columns
:::: column
## Cas 1b (symétrique 1a)

::::
:::: column
## Cas 1b (symétrique 1a)
*
Comment rééquilibrer?
. . .

::::
:::
# Les cas de déséquilibre
::: columns
:::: column
## Cas 2a
*
`h(v1)=h(v2), h(u)=h(w)`
.
*
déséquilibre en
`C`
après insertion dans
`v2`

::::
:::: column
## Cas 2a
*
Comment rééquilibrer?
. . .
*
ramène
`u`
,
`v2`
,
`w`
à la même hauteur (
`v1`
pas tout à fait).
*
`v2`
à droite de
`B`
(gauche de
`C`
)
*
`B`
à droite de
`A`
(gauche de
`C`
)
*
`v1`
à droite de
`A`
(gauche de
`B`
)

::::
:::
# Les cas de déséquilibre
::: columns
:::: column
## Cas 2b (symétrique 2a)

::::
:::: column
## Cas 2b (symétrique 2a)
*
Comment rééquilibrer?
. . .

::::
:::
[
^2
]:
Copyright
cours de mathématiques pendant trop d'années.
[
^2
]:
Copyright
cours de mathématiques pendant trop d'années.
This diff is collapsed.
Click to expand it.
slides/cours_19.md
0 → 100644
+
1235
−
0
View file @
67bd9a84
---
title
:
"
Arbres
AVL"
date
:
"
2024-03-25"
---
# Tri par tas: algorithme
\f
ootnotesize
*
Vous souvenez-vous de l'algorithme?
. . .
```
python
rien
tri_par_tas
(
tab
)
entassement
(
tab
)
échanger
(
tab
[
0
],
tab
[
size
(
tab
)
-
1
])
pour
i
de
size
(
tab
)
-
1
à
2
tamisage
(
tab
,
0
)
échanger
(
tab
[
0
],
tab
[
i
-
1
])
rien
entassement
(
tab
)
pour
i
de
size
(
tab
)
/
2
-
1
à
0
tamisage
(
tab
,
i
)
rien
tamisage
(
tab
,
i
)
ind_max
=
ind_max
(
tab
,
i
,
gauche
(
i
),
droite
(
i
))
si
i
!=
ind_max
échanger
(
tab
[
i
],
tab
[
ind_max
])
tamisage
(
tab
,
ind_max
)
```
# Un meilleur arbre
*
Quelle propriété doit satisfaire un arbre pour que la recherche soit $O(
\l
og_2(N))$?
. . .
*
Si on a environ le même nombre de nœuds dans les sous-arbres.
## Définition
Un arbre binaire est parfaitement équilibré si, pour chaque
nœud, la différence entre les nombres de nœuds des sous-
arbres gauche et droit vaut au plus 1.
*
Si l'arbre est
**parfaitement équilibré**
, alors tout ira bien.
*
Quelle est la hauteur (profondeur) d'un arbre parfaitement équilibré?
. . .
*
$O(
\l
og_2(N))$.
# Équilibre parfait ou pas?
::: columns
:::: column
```
{.mermaid format=pdf width=400 loc=figs/}
graph TD;
id0((W))-->id1((B));
id0-->id8((Y));
id1-->id2((A));
id1-->id9(( ));
id8-->id10((X));
id8-->id11(( ));
style id9 fill:#fff,stroke:#fff
style id11 fill:#fff,stroke:#fff
```
::::
:::: column
. . .
```
É
Q
U
I
L
I
B
R
É
```
::::
:::
# Équilibre parfait ou pas?
::: columns
:::: column
```
{.mermaid format=pdf width=400 loc=figs/}
graph TD;
id0((16))-->id1((10));
id0-->id2((19));
id1-->id3((8));
id1-->id4((12));
id4-->id5((11));
id4-->id6(( ));
id2-->id7((17));
id2-->id8(( ));
id7-->id9(( ));
id7-->id10((18));
style id6 fill:#fff,stroke:#fff
style id8 fill:#fff,stroke:#fff
style id9 fill:#fff,stroke:#fff
```
::::
:::: column
. . .
```
P
A
S
É
Q
U
I
L
I
B
R
É
```
::::
:::
# Arbres AVL
\f
ootnotesize
*
Quand est-ce qu'on équilibre un arbre?
. . .
*
A l'insertion/suppression.
*
Maintenir un arbre en état d'équilibre parfait: cher (insertion, suppression).
*
On peut "relaxer" la condition d'équilibre: profondeur (hauteur) au lieu du
nombre de nœuds:
*
La hauteur $
\s
im
\l
og_2(N)$.
## Définition
Un arbre AVL (Adelson-Velskii et Landis) est un arbre binaire de recherche dans
lequel, pour chaque nœud, la différence de hauteur entre le sous-arbre gauche et droit vaut au plus 1.
*
Relation entre nœuds et hauteur:
$$
\l
og_2(1+N)
\l
eq 1+H
\l
eq 1.44
\c
dot
\l
og_2(2+N),
\q
uad N=10^5,
\
17
\l
eq H
\l
eq 25.
$$
*
Permet l'équilibrage en temps constant: insertion/suppression $O(
\l
og_2(N))$.
# Notation
*
`hg`
: hauteur du sous-arbre gauche.
*
`hd`
: hauteur du sous-arbre droit.
*
`facteur d'équilibre = fe = hd - hg`
*
Que vaut
`fe`
si l'arbre est AVL?
. . .
*
`fe = {-1, 0, 1}`
# AVL ou pas?
::: columns
:::: column
```
{.mermaid format=pdf width=400 loc=figs/}
graph TD;
id0((12))-->id1((10));
id0-->id2((19));
id2-->id3((17));
id2-->id4((97));
```
::::
:::: column
. . .
```
A
V
L
```
::::
:::
# AVL ou pas?
::: columns
:::: column
```
{.mermaid format=pdf width=400 loc=figs/}
graph TD;
id0((12))-->id1((1));
id0-->id2((19));
id2-->id3((17));
id2-->id4((97));
id4-->id5((37));
id4-->id6(( ));
style id6 fill:#fff,stroke:#fff
```
::::
:::: column
. . .
```
P
A
S
A
V
L
```
::::
:::
# Insertion dans un arbre AVL (1/N)
1.
On part d'un arbre AVL.
2.
On insère un nouvel élément.
::: columns
:::: column
*
`hd ? hg`
.
*
Insertion de
`4`
?
```
{.mermaid format=pdf width=400 loc=figs/}
graph TD;
id0((12))-->id1((1));
id0-->id2((19));
```
::::
:::: column
. . .
*
`hd = hg`
```
{.mermaid format=pdf width=400 loc=figs/}
graph TD;
id0((12))-->id1((1));
id0-->id2((19));
id1-->id4(( ));
id1-->id5((4));
style id4 fill:#fff,stroke:#fff
```
*
`fe = -1`
::::
:::
# Insertion dans un arbre AVL (2/N)
1.
On part d'un arbre AVL.
2.
On insère un nouvel élément.
::: columns
:::: column
*
`hd ? hg`
.
*
Insertion de
`4`
?
```
{.mermaid format=pdf width=400 loc=figs/}
graph TD;
id0((12))-->id1((1));
id0-->id2((19));
id2-->id3((18));
id2-->id4(( ));
style id4 fill:#fff,stroke:#fff
```
::::
:::: column
. . .
*
`hd < hg`
```
{.mermaid format=pdf width=400 loc=figs/}
graph TD;
id0((12))-->id1((1));
id0-->id2((19));
id2-->id3((18));
id2-->id4(( ));
id1-->id5(( ));
id1-->id6((4));
style id4 fill:#fff,stroke:#fff
style id5 fill:#fff,stroke:#fff
```
*
`fe = 0`
::::
:::
# Insertion dans un arbre AVL (3/N)
\f
ootnotesize
1.
On part d'un arbre AVL.
2.
On insère un nouvel élément.
::: columns
:::: column
*
`hd ? hg`
.
*
Insertion de
`4`
?
```
{.mermaid format=pdf width=400 loc=figs/}
graph TD;
id0((12))-->id1((1));
id0-->id2((19));
id1-->id3(( ));
id1-->id4((6));
id2-->id5(( ));
id2-->id6(( ));
style id3 fill:#fff,stroke:#fff
style id5 fill:#fff,stroke:#fff
style id6 fill:#fff,stroke:#fff
```
::::
:::: column
. . .
*
`hd < hg`
```
{.mermaid format=pdf width=400 loc=figs/}
graph TD;
id0((12))-->id1((1));
id0-->id2((19));
id1-->id3(( ));
id1-->id4((6));
id4-->id5((4));
id4-->id6(( ));
id2-->id7(( ));
id2-->id8(( ));
style id3 fill:#fff,stroke:#fff
style id6 fill:#fff,stroke:#fff
style id7 fill:#fff,stroke:#fff
style id8 fill:#fff,stroke:#fff
```
::::
:::
**Déséquilibre!**
Que vaut
`fe`
?
. . .
*
`fe = 2`
# Les cas de déséquilibre
::: columns
:::: column
## Cas 1a
*
`u`
,
`v`
,
`w`
même hauteur.
*
déséquilibre en
`B`
après insertion dans
`u`

::::
:::: column
## Cas 1a
*
Comment rééquilibrer?
. . .
*
ramène
`u`
,
`v`
`w`
à la même hauteur.
*
`v`
à droite de
`A`
(gauche de
`B`
)

::::
:::
# Les cas de déséquilibre
::: columns
:::: column
## Cas 1b (symétrique 1a)

::::
:::: column
## Cas 1b (symétrique 1a)
*
Comment rééquilibrer?
. . .

::::
:::
# Les cas de déséquilibre
::: columns
:::: column
## Cas 2a
*
`h(v1)=h(v2), h(u)=h(w)`
.
*
déséquilibre en
`C`
après insertion dans
`v2`

::::
:::: column
## Cas 2a
*
Comment rééquilibrer?
. . .
*
ramène
`u`
,
`v2`
,
`w`
à la même hauteur (
`v1`
pas tout à fait).
*
`v2`
à droite de
`B`
(gauche de
`C`
)
*
`B`
à droite de
`A`
(gauche de
`C`
)
*
`v1`
à droite de
`A`
(gauche de
`B`
)

::::
:::
# Les cas de déséquilibre
::: columns
:::: column
## Cas 2b (symétrique 2a)

::::
:::: column
## Cas 2b (symétrique 2a)
*
Comment rééquilibrer?
. . .

::::
:::
# Le facteur d'équilibre (balance factor)
## Définition
```
fe(arbre) = hauteur(droite(arbre)) - hauteur(gauche(arbre))
```
## Valeurs possibles?
. . .
```
fe = {-1, 0, 1} // arbre AVL
fe = {-2, 2} // arbre déséquilibré
```

{width=40%}
# Algorithme d'insertion
*
Insérer le noeud comme d'habitude.
*
Mettre à jour les facteurs d'équilibre jusqu'à la racine (ou au premier
noeud déséquilibré).
*
Rééquilibrer le noeud si nécessaire.
## Cas possibles
::: columns
:::: column
## Sous-arbre gauche (avant)
```
fe(P) = 1
fe(P) = 0
fe(P) = -1
```
::::
:::: column
## Sous-arbre gauche (après)
. . .
```
=> fe(P) = 0
=> fe(P) = -1
=> fe(P) = -2 // Rééquilibrer P
```
::::
:::
# Algorithme d'insertion
*
Insérer le noeud comme d'habitude.
*
Mettre à jour les facteurs d'équilibre jusqu'à la racine (ou au premier
noeud déséquilibré).
*
Rééquilibrer le noeud si nécessaire.
## Cas possibles
::: columns
:::: column
## Sous-arbre droit (avant)
```
fe(P) = 1
fe(P) = 0
fe(P) = -1
```
::::
:::: column
## Sous-arbre droit (après)
. . .
```
=> fe(P) = 0
=> fe(P) = +1
=> fe(P) = +2 // Rééquilibrer P
```
::::
:::
# Rééquilibrage
## Lien avec les cas vus plus tôt
```
fe(P) = -2 && fe(gauche(P)) = -1 => cas 1a
fe(P) = -2 && fe(gauche(P)) = +1 => cas 2a
fe(P) = +2 && fe(droite(P)) = -1 => cas 2b
fe(P) = +2 && fe(droite(P)) = +1 => cas 1b
```
## Dessiner les différents cas, sur le dessin ci-dessous

# La rotation
## La rotation gauche (5min, matrix)

. . .
\f
ootnotesize
```
arbre rotation_gauche(arbre P)
si est_non_vide(P)
Q = droite(P)
droite(P) = gauche(Q)
gauche(Q) = P
retourne Q
retourne P
```
# La rotation en C (1/2)
## La rotation gauche
```
arbre rotation_gauche(arbre P)
si est_non_vide(P)
Q = droite(P)
droite(P) = gauche(Q)
gauche(Q) = P
retourne Q
retourne P
```
## Écrire le code C correspondant (5min, matrix)
1.
Structure de données
2.
Fonction
`tree_t rotation_left(tree_t tree)`
. . .
\f
ootnotesize
```
C
typedef struct _node {
int key;
struct _node *left, *right;
int bf; // balance factor
} node;
typedef node *tree_t;
```
# La rotation en C (2/2)
\f
ootnotesize
```
C
tree_t rotation_left(tree_t tree) {
tree_t subtree = NULL;
if (NULL != tree) {
subtree = tree->right;
tree->right = subtree->left;
subtree->left = tree;
}
return subtree;
}
```
. . .
*
Et la rotation à droite, pseudo-code (5min)?
. . .
```
arbre rotation_droite(arbre P)
si est_non_vide(P)
Q = gauche(P)
gauche(P) = droite(Q)
droite(Q) = P
retourne Q
retourne P
```
<!--
```C
tree_t rotation_right(tree_t tree) {
tree_t subtree = NULL;
if (NULL != tree) {
subtree = tree->left;
tree->left = subtree->right;
subtree->right = tree;
}
return subtree;
}
```
-->
# Exemple de rotation (1/2)
## Insertion de 9?
```
{.mermaid format=pdf width=400 loc=figs/}
graph TD;
id0((5))-->id1((1));
id0-->id2((6));
id2-->id3(( ));
id2-->id4((8));
style id3 fill:#fff,stroke:#fff
```
# Exemple de rotation (2/2)
::: columns
:::: column
## Quelle rotation et sur quel noeud (5 ou 6)?
```
{.mermaid format=pdf width=400 loc=figs/}
graph TD;
id0((5))-->id1((1));
id0-->id2((6));
id2-->id3(( ));
id2-->id4((8));
id4-->id5(( ));
id4-->id6((9));
style id3 fill:#fff,stroke:#fff
style id5 fill:#fff,stroke:#fff
```
::::
:::: column
. . .
## Sur le plus jeune évidemment!
```
{.mermaid format=pdf width=400 loc=figs/}
graph TD;
id0((5))-->id1((1));
id0-->id2((8));
id2-->id3((6));
id2-->id4((9));
```
::::
:::
*
Cas
`1a/b`
*check*
!
# La rotation gauche-droite
## Là c'est plus difficile (cas 2a/b)

# Exercices
## Faire l'implémentation de la double rotation (pas corrigé, 5min)
# Exercices
::: columns
:::: column
## Insérer 50, ex 10min (matrix)
```
{.mermaid format=pdf width=400 loc=figs/}
graph TD;
id0((89))-->id1((71));
id0-->id2((90));
id1-->id3((44));
id3-->id4((37));
id3-->id5((61));
id1-->id6((81))
id2-->id7(( ))
id2-->id8((100))
style id7 fill:#fff,stroke:#fff
```
::::
:::: column
. . .
## Où se fait la rotation?
```
{.mermaid format=pdf width=400 loc=figs/}
graph TD;
id0((89))-->id1((71));
id0-->id2((90));
id1-->id3((44));
id3-->id4((37));
id3-->id5((61));
id1-->id6((81))
id2-->id7(( ))
id2-->id8((100))
id5-->id9((50))
id5-->id10(( ))
style id7 fill:#fff,stroke:#fff
style id10 fill:#fff,stroke:#fff
```
::::
:::
# Exercices
::: columns
:::: column
## Rotation gauche en 44
```
{.mermaid format=pdf width=400 loc=figs/}
graph TD;
id0((89))-->id1((71));
id0-->id2((90));
id1-->id3((61));
id1-->id10((81));
id3-->id4((44));
id3-->id5(( ));
id4-->id6((37))
id4-->id7((50))
id2-->id8(( ))
id2-->id9((100))
style id5 fill:#fff,stroke:#fff
style id8 fill:#fff,stroke:#fff
```
::::
:::: column
. . .
## Rotation à droite en 71
```
{.mermaid format=pdf width=400 loc=figs/}
graph TD;
id0((89))-->id1((61));
id0-->id2((90));
id1-->id3((44));
id1-->id10((71));
id3-->id4((37));
id3-->id5((50));
id2-->id8(( ));
id2-->id9((100));
id10-->id11(( ))
id10-->id12((81))
style id8 fill:#fff,stroke:#fff
style id11 fill:#fff,stroke:#fff
```
::::
:::
# Exercice de la mort
Soit l’arbre AVL suivant:
::: columns
:::: column
```
{.mermaid format=pdf width=400 loc=figs/}
graph TD;
id0((60))-->id1((40));
id0-->id2((120));
id1-->id3((20));
id1-->id4((50));
id3-->id5((10));
id3-->id6((30));
id2-->id7((100));
id2-->id8((140));
id7-->id9((80))
id7-->id10((110))
id9-->id11((70))
id9-->id12((90))
id8-->id13((130))
id8-->id14((160))
id14-->id15((150))
id14-->id16((170))
```
::::
:::: column
1.
Montrer les positions des insertions de feuille qui conduiront à un arbre
désequilibré.
2.
Donner les facteurs d’equilgaucheibre.
3.
Dessiner et expliquer les modifications de l’arbre lors de l’insertion de la
valeur
`65`
. On mentionnera les modifications des facteurs
d’équilibre.
::::
:::
# Encore un petit exercice
*
Insérer les nœuds suivants dans un arbre AVL
```
25 | 60 | 35 | 10 | 5 | 20 | 65 | 45 | 70 | 40
| 50 | 55 | 30 | 15
```
## Un à un et le/la premier/ère qui poste la bonne réponse sur matrix a un point
# Suppression dans un arbre AVL
::: columns
:::: column
## Algorithme par problème: supprimer 10
```
{.mermaid format=pdf width=400 loc=figs/}
graph TD;
id0((8))-->id1((4));
id0-->id2((10));
id1-->id3((2));
id1-->id4((6));
id3-->id5((1));
id3-->id6(( ))
id4-->id7(( ))
id4-->id8((7))
id2-->id9((9))
id2-->id10((14))
id10-->id11((12))
id10-->id12((16))
style id6 fill:#fff,stroke:#fff
style id7 fill:#fff,stroke:#fff
```
::::
:::: column
. . .
## Algorithme par problème: supprimer 10
```
{.mermaid format=pdf width=400 loc=figs/}
graph TD;
id0((8))-->id1((4));
id0-->id2((12));
id1-->id3((2));
id1-->id4((6));
id3-->id5((1));
id3-->id6(( ))
id4-->id7(( ))
id4-->id8((7))
id2-->id9((9))
id2-->id10((14))
id10-->id11(( ))
id10-->id12((16))
style id6 fill:#fff,stroke:#fff
style id7 fill:#fff,stroke:#fff
style id11 fill:#fff,stroke:#fff
```
::::
:::
# Suppression dans un arbre AVL
::: columns
:::: column
## Algorithme par problème: supprimer 8
```
{.mermaid format=pdf width=400 loc=figs/}
graph TD;
id0((8))-->id1((4));
id0-->id2((12));
id1-->id3((2));
id1-->id4((6));
id3-->id5((1));
id3-->id6(( ))
id4-->id7(( ))
id4-->id8((7))
id2-->id9((9))
id2-->id10((14))
id10-->id11(( ))
id10-->id12((16))
style id6 fill:#fff,stroke:#fff
style id7 fill:#fff,stroke:#fff
style id11 fill:#fff,stroke:#fff
```
::::
:::: column
. . .
## Algorithme par problème: rotation de 12
```
{.mermaid format=pdf width=400 loc=figs/}
graph TD;
id0((9))-->id1((4));
id0-->id2((12));
id1-->id3((2));
id1-->id4((6));
id3-->id5((1));
id3-->id6(( ))
id4-->id7(( ))
id4-->id8((7))
id2-->id9(( ))
id2-->id10((14))
id10-->id11(( ))
id10-->id12((16))
style id6 fill:#fff,stroke:#fff
style id7 fill:#fff,stroke:#fff
style id9 fill:#fff,stroke:#fff
style id11 fill:#fff,stroke:#fff
```
::::
:::
# Suppression dans un arbre AVL
::: columns
:::: column
## Algorithme par problème: rotation de 12
```
{.mermaid format=pdf width=400 loc=figs/}
graph TD;
id0((9))-->id1((4));
id0-->id2((14));
id1-->id3((2));
id1-->id4((6));
id3-->id5((1));
id3-->id6(( ))
id4-->id7(( ))
id4-->id8((7))
id2-->id9((12))
id2-->id10((16))
style id6 fill:#fff,stroke:#fff
style id7 fill:#fff,stroke:#fff
```
::::
:::: column
. . .
1.
On supprime comme d'habitude.
2.
On rééquilibre si besoin à l'endroit de la suppression.
*
Facile non?
. . .
*
Plus dur....
::::
:::
# Suppression dans un arbre AVL 2.0
::: columns
:::: column
## Algorithme par problème: suppression de 30
```
{.mermaid format=pdf width=400 loc=figs/}
graph TD;
id0((50))-->id1((30));
id0-->id2((100));
id1-->id3((10));
id1-->id4((40));
id3-->id5(( ));
id3-->id6((20))
id2-->id7((80))
id2-->id8((200))
id7-->id9((70))
id7-->id10((90))
id9-->id11((60))
id9-->id12(( ))
id8-->id13(( ))
id8-->id14((300))
style id5 fill:#fff,stroke:#fff
style id12 fill:#fff,stroke:#fff
style id13 fill:#fff,stroke:#fff
```
::::
:::: column
. . .
## Algorithme par problème: rotation GD autour de 40
```
{.mermaid format=pdf width=400 loc=figs/}
graph TD;
id0((50))-->id1((40));
id0-->id2((100));
id1-->id3((10));
id1-->id4(( ));
id3-->id5(( ));
id3-->id6((20))
id2-->id7((80))
id2-->id8((200))
id7-->id9((70))
id7-->id10((90))
id9-->id11((60))
id9-->id12(( ))
id8-->id13(( ))
id8-->id14((300))
style id4 fill:#fff,stroke:#fff
style id5 fill:#fff,stroke:#fff
style id12 fill:#fff,stroke:#fff
style id13 fill:#fff,stroke:#fff
```
::::
:::
# Suppression dans un arbre AVL 2.0
::: columns
:::: column
## Argl! 50 est déséquilibré!
```
{.mermaid format=pdf width=400 loc=figs/}
graph TD;
id0((50))-->id1((20));
id0-->id2((100));
id1-->id3((10));
id1-->id4((40));
id2-->id7((80))
id2-->id8((200))
id7-->id9((70))
id7-->id10((90))
id9-->id11((60))
id9-->id12(( ))
id8-->id13(( ))
id8-->id14((300))
style id12 fill:#fff,stroke:#fff
style id13 fill:#fff,stroke:#fff
```
::::
:::: column
. . .
## Algorithme par problème: rotation DG autour de 50
```
{.mermaid format=pdf width=400 loc=figs/}
graph TD;
id0((80))-->id1((50));
id0-->id2((100));
id1-->id3((20));
id1-->id4((70));
id3-->id5((10));
id3-->id6((40));
id4-->id9((60))
id4-->id10(( ))
id2-->id7((90))
id2-->id8((200))
id8-->id13(( ))
id8-->id14((300))
style id10 fill:#fff,stroke:#fff
style id13 fill:#fff,stroke:#fff
```
::::
:::
# Résumé de la suppression
1.
On supprime comme pour un arbre binaire de recherche.
2.
Si un nœud est déséquilibré, on le rééquilibre.
*
Cette opération peut déséquilibrer un autre nœud.
3.
On continue à rééquilibrer tant qu'il y a des nœuds à équilibrer.
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment