diff --git a/slides/cours_16.md b/slides/cours_16.md index 67fd4997a263572e9e9c7c48344071f0415e6923..2bf80b9cbd0324ea7f52604b5c51f0845346633b 100644 --- a/slides/cours_16.md +++ b/slides/cours_16.md @@ -1,5 +1,5 @@ --- -title: "Arbres" +title: "Arbres et tri par tas" date: "2022-03-02" patat: eval: @@ -218,3 +218,409 @@ flowchart TB; ::: +# Trier un tableau à l'aide d'un arbre binaire + +* Tableau représenté comme un arbre binaire. +* Aide à comprendre "comment" trier, mais on ne construit jamais l'arbre. +* Complexité $O(N\log_2 N)$ en moyenne et grande stabilité (pas de cas + dégénérés). + +# Lien entre arbre et tableau + +* La racine de l'arbre set le premier élément du tableau. +* Les deux fils d'un noeud d'indice $i$, ont pour indices $2i+1$ et $2i+2$: + * Les fils du noeud $i=0$, sont à $2\cdot 0+1=1$ et $2\cdot 0+2=2$. + * Les fils du noeud $i=1$, sont à $2\cdot 1+1=3$ et $2\cdot 1+2=4$. + * Les fils du noeud $i=2$, sont à $2\cdot 2+2=5$ et $2\cdot 1+2=6$. + * Les fils du noeud $i=3$, sont à $2\cdot 3+1=7$ et $2\cdot 3+2=8$. +* Un élément d'indice $i$ a pour parent l'élément $(i-1)/2$ (division entière): + * Le parent du noeud $i=8$ est $(8-1)/2=3$. + * Le parent du noeud $i=7$ est $(7-1)/2=3$. + +# Visuellement + +::: columns + +:::: column + +* Où vont les indices correspondant du tableau? + +```{.mermaid format=pdf width=400 loc=figs/} +graph TD; + id0(( ))-->id1(( )); + id0-->id2(( )); + id1-->id3(( )); + id1-->id4(( )); + id2-->id5(( )); + id2-->id6(( )); + id3-->id7(( )); + id3-->id8(( )); + id4-->id9(( )); + id4-->id10(( )); + style id10 fill:#fff,stroke:#fff +``` +:::: + +:::: column + +* Les flèche de gauche à droite, parent -> enfants. +* Les flèche de droite à gauche, enfants -> parent. + + + +:::: + +::: + +**Propriétés:** + +1. les feuilles sont toutes sur l'avant dernier ou dernier niveau. +2. les feuilles de profondeur maximale sont "tassée" à gauche. + +# Le tas (ou heap) + +## Définition + +* Un arbre est un tas, si la valeur de chacun de ses descendants est inférieure + ou égale à sa propre valeur. + +## Exemples (ou pas) + +``` +16 8 14 6 2 10 12 4 5 # Tas +16 14 8 6 2 10 12 4 5 # Non-tas, 10 > 8 et 12 > 8 +``` + +## Exercices (ou pas) + +``` +19 18 12 12 17 1 13 4 5 # Tas ou pas tas? +19 18 16 12 17 1 12 4 5 # Tas ou pas tas? +``` + +. . . + +``` +19 18 12 12 17 1 13 4 5 # Pas tas! 13 > 12 +19 18 16 12 17 1 12 4 5 # Tas! +``` + +# Exemple de tri par tas (1/N) + +``` + | 1 | 16 | 5 | 12 | 4 | 2 | 8 | 10 | 6 | 7 | +``` + +::: columns + +:::: column + +* Quel est l'arbre que cela représente? + +. . . + +```{.mermaid format=pdf width=400 loc=figs/} +graph TD; + id0((1))-->id1((16)); + id0-->id2((5)); + id1-->id3((12)); + id1-->id4((4)); + id2-->id5((2)); + id2-->id6((8)); + id3-->id7((10)); + id3-->id8((6)); + id4-->id9((7)); + id4-->id10(( )); + style id10 fill:#fff,stroke:#fff +``` + +:::: + +:::: column + +**But:** Transformer l'arbre en tas. + +* On commence à l'indice $N/2 = 5$: `7`. +* `7 > 4` (enfant `>` parent). +* intervertir `4` et `7`. + +```{.mermaid format=pdf width=400 loc=figs/} +graph TD; + id0((1))-->id1((16)); + id0-->id2((5)); + id1-->id3((12)); + id1-->id4((7)); + id2-->id5((2)); + id2-->id6((8)); + id3-->id7((10)); + id3-->id8((6)); + id4-->id9((4)); + id4-->id10(( )); + style id10 fill:#fff,stroke:#fff +``` + +:::: + +::: + +. . . + +``` + * * + | 1 | 16 | 5 | 12 | 7 | 2 | 8 | 10 | 6 | 4 | +``` + +# Exemple de tri par tas (2/N) + +``` + | 1 | 16 | 5 | 12 | 7 | 2 | 8 | 10 | 6 | 4 | +``` + +::: columns + +:::: column + +**But:** Transformer l'arbre en tas. + +* On continue à l'indice $N/2-1 = 4$: `12`. +* Déjà un tas, rien à faire. + +```{.mermaid format=pdf width=400 loc=figs/} +graph TD; + id0((1))-->id1((16)); + id0-->id2((5)); + id1-->id3((12)); + id1-->id4((7)); + id2-->id5((2)); + id2-->id6((8)); + id3-->id7((10)); + id3-->id8((6)); + id4-->id9((4)); + id4-->id10(( )); + style id10 fill:#fff,stroke:#fff +``` + +:::: + +:::: column + +**But:** Transformer l'arbre en tas. + +* On continue à l'indice $N/2-2 = 3$: `5`. +* `5 < 8`, échanger `8` et `5` (aka `max(2, 5, 8)`) + +```{.mermaid format=pdf width=400 loc=figs/} +graph TD; + id0((1))-->id1((16)); + id0-->id2((8)); + id1-->id3((12)); + id1-->id4((7)); + id2-->id5((2)); + id2-->id6((5)); + id3-->id7((10)); + id3-->id8((6)); + id4-->id9((4)); + id4-->id10(( )); + style id10 fill:#fff,stroke:#fff +``` + +:::: + +::: + +. . . + +``` + | 1 | 16 | 8 | 12 | 7 | 2 | 5 | 10 | 6 | 4 | +``` + +# Exemple de tri par tas (3/N) + +``` + | 1 | 16 | 5 | 12 | 7 | 2 | 8 | 10 | 6 | 4 | +``` + +::: columns + +:::: column + +**But:** Transformer l'arbre en tas. + +* Indice $N/2-1 = 4$: `12`. +* Déjà un tas, rien à faire. + +```{.mermaid format=pdf width=400 loc=figs/} +graph TD; + id0((1))-->id1((16)); + id0-->id2((5)); + id1-->id3((12)); + id1-->id4((7)); + id2-->id5((2)); + id2-->id6((8)); + id3-->id7((10)); + id3-->id8((6)); + id4-->id9((4)); + id4-->id10(( )); + style id10 fill:#fff,stroke:#fff +``` + +:::: + +:::: column + +**But:** Transformer l'arbre en tas. + +* Indice $N/2-2 = 3$: `5`. +* `5 < 8`, `5 <=> max(2, 5, 8)` + +```{.mermaid format=pdf width=400 loc=figs/} +graph TD; + id0((1))-->id1((16)); + id0-->id2((8)); + id1-->id3((12)); + id1-->id4((7)); + id2-->id5((2)); + id2-->id6((5)); + id3-->id7((10)); + id3-->id8((6)); + id4-->id9((4)); + id4-->id10(( )); + style id10 fill:#fff,stroke:#fff +``` + +:::: + +::: + +``` + * * + | 1 | 16 | 8 | 12 | 7 | 2 | 5 | 10 | 6 | 4 | +``` + +# Exemple de tri par tas (4/N) + +``` + | 1 | 16 | 8 | 12 | 7 | 2 | 5 | 10 | 6 | 4 | +``` + +::: columns + +:::: column + +**But:** Transformer l'arbre en tas. + +* Indice $N/2-3 = 1$: `16`. +* Déjà un tas, rien à faire. + +```{.mermaid format=pdf width=400 loc=figs/} +graph TD; + id0((1))-->id1((16)); + id0-->id2((5)); + id1-->id3((12)); + id1-->id4((7)); + id2-->id5((2)); + id2-->id6((8)); + id3-->id7((10)); + id3-->id8((6)); + id4-->id9((4)); + id4-->id10(( )); + style id10 fill:#fff,stroke:#fff +``` + +:::: + +:::: column + +**But:** Transformer l'arbre en tas. + +* Indice $N/2-4 = 1$: `1`. +* `1 < 16 && 1 < 8`, `1 <=> max(1, 16, 8)` + +```{.mermaid format=pdf width=400 loc=figs/} +graph TD; + id0((16))-->id1((1)); + id0-->id2((8)); + id1-->id3((12)); + id1-->id4((7)); + id2-->id5((2)); + id2-->id6((5)); + id3-->id7((10)); + id3-->id8((6)); + id4-->id9((4)); + id4-->id10(( )); + style id10 fill:#fff,stroke:#fff +``` + +:::: + +::: + +``` + * * + | 16 | 1 | 8 | 12 | 7 | 2 | 5 | 10 | 6 | 4 | +``` + + +# Exemple de tri par tas (5/N) + +``` + | 16 | 1 | 8 | 12 | 7 | 2 | 5 | 10 | 6 | 4 | +``` + +::: columns + +:::: column + +**But:** Transformer l'arbre en tas. + +* Recommencer avec `1`. +* `1 <=> max(1, 12, 7)`. + +```{.mermaid format=pdf width=400 loc=figs/} +graph TD; + id0((16))-->id1((12)); + id0-->id2((5)); + id1-->id3((1)); + id1-->id4((7)); + id2-->id5((2)); + id2-->id6((8)); + id3-->id7((10)); + id3-->id8((6)); + id4-->id9((4)); + id4-->id10(( )); + style id10 fill:#fff,stroke:#fff +``` + +:::: + +:::: column + +**But:** Transformer l'arbre en tas. + +* Recommencer avec `1`. +* `1 <=> max(1, 10, 6)`. + +```{.mermaid format=pdf width=400 loc=figs/} +graph TD; + id0((16))-->id1((12)); + id0-->id2((8)); + id1-->id3((10)); + id1-->id4((7)); + id2-->id5((2)); + id2-->id6((5)); + id3-->id7((1)); + id3-->id8((6)); + id4-->id9((4)); + id4-->id10(( )); + style id10 fill:#fff,stroke:#fff +``` + +:::: + +::: + +``` + * * * + | 16 | 12 | 8 | 10 | 7 | 2 | 5 | 1 | 6 | 4 | +``` + diff --git a/slides/tri_par_tas.md b/slides/tri_par_tas.md deleted file mode 100644 index 4da67aa1fd0aac9d26720646ff92267a38af59a9..0000000000000000000000000000000000000000 --- a/slides/tri_par_tas.md +++ /dev/null @@ -1,410 +0,0 @@ ---- -title: "Le tri par tas" -date: "2022-03-02" ---- - -# Trier un tableau à l'aide d'un arbre binaire - -* Tableau représenté comme un arbre binaire. -* Aide à comprendre "comment" trier, mais on ne construit jamais l'arbre. -* Complexité $O(N\log_2 N)$ en moyenne et grande stabilité (pas de cas - dégénérés). - -# Lien entre arbre et tableau - -* La racine de l'arbre set le premier élément du tableau. -* Les deux fils d'un noeud d'indice $i$, ont pour indices $2i+1$ et $2i+2$: - * Les fils du noeud $i=0$, sont à $2\cdot 0+1=1$ et $2\cdot 0+2=2$. - * Les fils du noeud $i=1$, sont à $2\cdot 1+1=3$ et $2\cdot 1+2=4$. - * Les fils du noeud $i=2$, sont à $2\cdot 2+2=5$ et $2\cdot 1+2=6$. - * Les fils du noeud $i=3$, sont à $2\cdot 3+1=7$ et $2\cdot 3+2=8$. -* Un élément d'indice $i$ a pour parent l'élément $(i-1)/2$ (division entière): - * Le parent du noeud $i=8$ est $(8-1)/2=3$. - * Le parent du noeud $i=7$ est $(7-1)/2=3$. - -# Visuellement - -::: columns - -:::: column - -* Où vont les indices correspondant du tableau? - -```{.mermaid format=pdf width=400 loc=figs/} -graph TD; - id0(( ))-->id1(( )); - id0-->id2(( )); - id1-->id3(( )); - id1-->id4(( )); - id2-->id5(( )); - id2-->id6(( )); - id3-->id7(( )); - id3-->id8(( )); - id4-->id9(( )); - id4-->id10(( )); - style id10 fill:#fff,stroke:#fff -``` -:::: - -:::: column - -* Les flèche de gauche à droite, parent -> enfants. -* Les flèche de droite à gauche, enfants -> parent. - - - -:::: - -::: - -**Propriétés:** - -1. les feuilles sont toutes sur l'avant dernier ou dernier niveau. -2. les feuilles de profondeur maximale sont "tassée" à gauche. - -# Le tas (ou heap) - -## Définition - -* Un arbre est un tas, si la valeur de chacun de ses descendants est inférieure - ou égale à sa propre valeur. - -## Exemples (ou pas) - -``` -16 8 14 6 2 10 12 4 5 # Tas -16 14 8 6 2 10 12 4 5 # Non-tas, 10 > 8 et 12 > 8 -``` - -## Exercices (ou pas) - -``` -19 18 12 12 17 1 13 4 5 # Tas ou pas tas? -19 18 16 12 17 1 12 4 5 # Tas ou pas tas? -``` - -. . . - -``` -19 18 12 12 17 1 13 4 5 # Pas tas! 13 > 12 -19 18 16 12 17 1 12 4 5 # Tas! -``` - -# Exemple de tri par tas (1/N) - -``` - | 1 | 16 | 5 | 12 | 4 | 2 | 8 | 10 | 6 | 7 | -``` - -::: columns - -:::: column - -* Quel est l'arbre que cela représente? - -. . . - -```{.mermaid format=pdf width=400 loc=figs/} -graph TD; - id0((1))-->id1((16)); - id0-->id2((5)); - id1-->id3((12)); - id1-->id4((4)); - id2-->id5((2)); - id2-->id6((8)); - id3-->id7((10)); - id3-->id8((6)); - id4-->id9((7)); - id4-->id10(( )); - style id10 fill:#fff,stroke:#fff -``` - -:::: - -:::: column - -**But:** Transformer l'arbre en tas. - -* On commence à l'indice $N/2 = 5$: `7`. -* `7 > 4` (enfant `>` parent). -* intervertir `4` et `7`. - -```{.mermaid format=pdf width=400 loc=figs/} -graph TD; - id0((1))-->id1((16)); - id0-->id2((5)); - id1-->id3((12)); - id1-->id4((7)); - id2-->id5((2)); - id2-->id6((8)); - id3-->id7((10)); - id3-->id8((6)); - id4-->id9((4)); - id4-->id10(( )); - style id10 fill:#fff,stroke:#fff -``` - -:::: - -::: - -. . . - -``` - * * - | 1 | 16 | 5 | 12 | 7 | 2 | 8 | 10 | 6 | 4 | -``` - -# Exemple de tri par tas (2/N) - -``` - | 1 | 16 | 5 | 12 | 7 | 2 | 8 | 10 | 6 | 4 | -``` - -::: columns - -:::: column - -**But:** Transformer l'arbre en tas. - -* On continue à l'indice $N/2-1 = 4$: `12`. -* Déjà un tas, rien à faire. - -```{.mermaid format=pdf width=400 loc=figs/} -graph TD; - id0((1))-->id1((16)); - id0-->id2((5)); - id1-->id3((12)); - id1-->id4((7)); - id2-->id5((2)); - id2-->id6((8)); - id3-->id7((10)); - id3-->id8((6)); - id4-->id9((4)); - id4-->id10(( )); - style id10 fill:#fff,stroke:#fff -``` - -:::: - -:::: column - -**But:** Transformer l'arbre en tas. - -* On continue à l'indice $N/2-2 = 3$: `5`. -* `5 < 8`, échanger `8` et `5` (aka `max(2, 5, 8)`) - -```{.mermaid format=pdf width=400 loc=figs/} -graph TD; - id0((1))-->id1((16)); - id0-->id2((8)); - id1-->id3((12)); - id1-->id4((7)); - id2-->id5((2)); - id2-->id6((5)); - id3-->id7((10)); - id3-->id8((6)); - id4-->id9((4)); - id4-->id10(( )); - style id10 fill:#fff,stroke:#fff -``` - -:::: - -::: - -. . . - -``` - | 1 | 16 | 8 | 12 | 7 | 2 | 5 | 10 | 6 | 4 | -``` - -# Exemple de tri par tas (3/N) - -``` - | 1 | 16 | 5 | 12 | 7 | 2 | 8 | 10 | 6 | 4 | -``` - -::: columns - -:::: column - -**But:** Transformer l'arbre en tas. - -* Indice $N/2-1 = 4$: `12`. -* Déjà un tas, rien à faire. - -```{.mermaid format=pdf width=400 loc=figs/} -graph TD; - id0((1))-->id1((16)); - id0-->id2((5)); - id1-->id3((12)); - id1-->id4((7)); - id2-->id5((2)); - id2-->id6((8)); - id3-->id7((10)); - id3-->id8((6)); - id4-->id9((4)); - id4-->id10(( )); - style id10 fill:#fff,stroke:#fff -``` - -:::: - -:::: column - -**But:** Transformer l'arbre en tas. - -* Indice $N/2-2 = 3$: `5`. -* `5 < 8`, `5 <=> max(2, 5, 8)` - -```{.mermaid format=pdf width=400 loc=figs/} -graph TD; - id0((1))-->id1((16)); - id0-->id2((8)); - id1-->id3((12)); - id1-->id4((7)); - id2-->id5((2)); - id2-->id6((5)); - id3-->id7((10)); - id3-->id8((6)); - id4-->id9((4)); - id4-->id10(( )); - style id10 fill:#fff,stroke:#fff -``` - -:::: - -::: - -``` - * * - | 1 | 16 | 8 | 12 | 7 | 2 | 5 | 10 | 6 | 4 | -``` - -# Exemple de tri par tas (4/N) - -``` - | 1 | 16 | 8 | 12 | 7 | 2 | 5 | 10 | 6 | 4 | -``` - -::: columns - -:::: column - -**But:** Transformer l'arbre en tas. - -* Indice $N/2-3 = 1$: `16`. -* Déjà un tas, rien à faire. - -```{.mermaid format=pdf width=400 loc=figs/} -graph TD; - id0((1))-->id1((16)); - id0-->id2((5)); - id1-->id3((12)); - id1-->id4((7)); - id2-->id5((2)); - id2-->id6((8)); - id3-->id7((10)); - id3-->id8((6)); - id4-->id9((4)); - id4-->id10(( )); - style id10 fill:#fff,stroke:#fff -``` - -:::: - -:::: column - -**But:** Transformer l'arbre en tas. - -* Indice $N/2-4 = 1$: `1`. -* `1 < 16 && 1 < 8`, `1 <=> max(1, 16, 8)` - -```{.mermaid format=pdf width=400 loc=figs/} -graph TD; - id0((16))-->id1((1)); - id0-->id2((8)); - id1-->id3((12)); - id1-->id4((7)); - id2-->id5((2)); - id2-->id6((5)); - id3-->id7((10)); - id3-->id8((6)); - id4-->id9((4)); - id4-->id10(( )); - style id10 fill:#fff,stroke:#fff -``` - -:::: - -::: - -``` - * * - | 16 | 1 | 8 | 12 | 7 | 2 | 5 | 10 | 6 | 4 | -``` - - -# Exemple de tri par tas (5/N) - -``` - | 16 | 1 | 8 | 12 | 7 | 2 | 5 | 10 | 6 | 4 | -``` - -::: columns - -:::: column - -**But:** Transformer l'arbre en tas. - -* Recommencer avec `1`. -* `1 <=> max(1, 12, 7)`. - -```{.mermaid format=pdf width=400 loc=figs/} -graph TD; - id0((16))-->id1((12)); - id0-->id2((5)); - id1-->id3((1)); - id1-->id4((7)); - id2-->id5((2)); - id2-->id6((8)); - id3-->id7((10)); - id3-->id8((6)); - id4-->id9((4)); - id4-->id10(( )); - style id10 fill:#fff,stroke:#fff -``` - -:::: - -:::: column - -**But:** Transformer l'arbre en tas. - -* Recommencer avec `1`. -* `1 <=> max(1, 10, 6)`. - -```{.mermaid format=pdf width=400 loc=figs/} -graph TD; - id0((16))-->id1((12)); - id0-->id2((8)); - id1-->id3((10)); - id1-->id4((7)); - id2-->id5((2)); - id2-->id6((5)); - id3-->id7((1)); - id3-->id8((6)); - id4-->id9((4)); - id4-->id10(( )); - style id10 fill:#fff,stroke:#fff -``` - -:::: - -::: - -``` - * * * - | 16 | 12 | 8 | 10 | 7 | 2 | 5 | 1 | 6 | 4 | -```