diff --git a/slides/cours_24.md b/slides/cours_24.md index 5dcea3696cb3d4b5cc24439b9abc037069ba60c8..0f87f7888984065c9f9a3575b0388fcd84229ca8 100644 --- a/slides/cours_24.md +++ b/slides/cours_24.md @@ -19,7 +19,7 @@ patat: **Un mini-peu d'histoire...** -## L. Euler, les 7 ponts de Koenigsberg: +## L. Euler et les 7 ponts de Koenigsberg: * Existe-t-il une promenade sympa, passant **une seule fois** par les 7 ponts et revenant au point de départ? @@ -492,7 +492,7 @@ $$ * Dans la majorité des cas, les grands graphes sont peu denses. * Comment représenter un graphe autrement? -# La liste d'adjacence +# La liste d'adjacence (non-orienté) * Pour chaque sommet $v\in V$, stocker les sommets adjacents à $v$- * Quelle structure de données pour la liste d'adjacence? @@ -526,3 +526,285 @@ $$ ::: +# La liste d'adjacence (orienté) + + +::: columns + +:::: column + +## Quelle liste d'adjacence pour... + +* Matrix (2min) + +```{.mermaid format=pdf width=400 loc=figs/} +graph LR; + 0-->1; + 0-->2; + 1-->2; + 3-->0; + 3-->1; + 3-->2; +``` + +:::: + +:::: column + +``` + + + + + + + + + + + +``` + + +:::: + +::: + +# Complexité + +## Stockage + +* Quelle espace est nécessaire pour stocker une liste d'adjacence (en fonction de $|E|$ et $|V|$)? + +. . . + +$$ +\mathcal{O}(|E|) +$$ + +* Pour les graphes *non-orientés*: $\mathcal{O}2|E|$. +* Pour les graphes *orientés*: $\mathcal{O}|E|$. + +## Définition + +* Le **degré** d'un sommet $v$, est le nombre d'arêtes incidentes du sommet (pour les graphes non-orientés on a un degré entrant ou sortant). +* Comment on retrouve le degré de chaque sommet avec la liste d'adjacence? + +. . . + +* C'est la longueur de la liste chaînée. + + +# Parcours + +* Beaucoup d'applications nécessitent de parcourir des graphes: + * Trouver un chemin d'un sommet à un autre; + * Trouver si le graphe est connexe; +* Il existe *deux* parcours principaux: + * en largeur; + * en profondeur. +* Ces parcours créent *un arbre* au fil de l'exploration (si le graphe est non-connexe cela crée une *forêt*, un ensemble d'arbres). + +# Illustration: parcours en largeur + +{width=80%} + +# Exemple + +## Étape par étape (blanc non-visité) + +{width=50%} + +## Étape par étape (gris visité) + +{width=50%} + +# Exemple + +## Étape par étape + +{width=50%} + +## Étape par étape (vert à visiter) + +{width=50%} + +# Exemple + +## Étape par étape + +{width=50%} + +## Étape par étape + +{width=50%} + +# Exemple + +## Étape par étape + +{width=50%} + +## Étape par étape + +{width=50%} + +# Exemple + +## Étape par étape + +{width=50%} + +## Étape par étape + +{width=50%} + +# Exemple + +## Étape par étape + +{width=50%} + +## Étape par étape + +{width=50%} + +# En faisant ce parcours... + + +::: columns + +:::: column + +## Du parcours de l'arbre + +{width=100%} + +:::: + +:::: column + +## Quel arbre est créé par le parcours (2min)? + +. . . + +```{.mermaid format=pdf width=400 loc=figs/} +graph LR; + 0[x]-->1[w]; + 0-->2[t]; + 0-->3[y]; + 2-->9[u]; + 1-->4[s]; + 4-->5[r]; + 5-->6[v]; +``` + +:::: + +::: + +## Remarques + +* Le parcours dépend du point de départ dans le graphe. +* L'arbre sera différent en fonction du noeud de départ, et de l'ordre de parcours des voisins d'un noeud. + +# Le parcours en largeur + +## L'algorithme, idée générale (3min, matrix)? + +. . . + +```C +v = un sommet du graphe +i = 1 +pour sommet dans graphe et sommet non-visité + visiter(v, sommet, i) // marquer sommet à distance i visité + i += 1 +``` + +## Remarque + +* `i` est la distance de plus cours chemin entre `v` et les sommets en cours de visite. + + +# Le parcours en largeur + +## L'algorithme, pseudo-code (3min, matrix)? + +* Comment garder la trace de la distance? + +. . . + +* Utilisation d'une **file** + +. . . + +```C +initialiser(graphe) // tous sommets sont non-visités +file = visiter(sommet) // sommet est un sommet du graphe au hasard +tant que !est_vide(file) + v = défiler(file) + file = visiter(u) +``` + +## Que fait visiter? + +``` +file visiter(sommet) + sommet = visité + pour w = chaque arête de sommet + si w != visité + file = enfiler(file, w) + retourne file +``` + +# Exercice (5min) + +## Appliquer l'algorithme sur le graphe + +{width=50%} + +* En partant de `v`, `s`, ou `u` (par colonne de classe). +* Bien mettre à chaque étape l'état de la file. + +# Complexité du parcours en largeur + +## Étape 1 + +* Extraire un sommet de la file; + +## Étape 2 + +* Traîter tous les sommets adjacents. + +## Quelle est la coplexité? + +. . . + +* Étape 1: $\mathcal{O}(|V|)$, +* Étape 2: $\mathcal{O}(2|E|)$, +* Total: $\mathcal{O}(|V| + |2|E|)$. + +# Exercice + +* Établir la liste d'adjacence et appliquer l'algorithme de parcours en largeur au graphe + +```{.mermaid format=pdf width=400 loc=figs/} +graph LR; + 1---2; + 1---3; + 1---4; + 2---3; + 2---6; + 3---6; + 3---4; + 3---5; + 4---5; +``` + + +# Illustration: parcours en profondeur + +{width=80%} + + diff --git a/slides/figs/parcours_larg_0.pdf b/slides/figs/parcours_larg_0.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ebcfe173b215f594ff61bb6699530338daa8bddd Binary files /dev/null and b/slides/figs/parcours_larg_0.pdf differ diff --git a/slides/figs/parcours_larg_1.pdf b/slides/figs/parcours_larg_1.pdf new file mode 100644 index 0000000000000000000000000000000000000000..9cf62a943e8275c254580965db2e606af414b29d Binary files /dev/null and b/slides/figs/parcours_larg_1.pdf differ diff --git a/slides/figs/parcours_larg_2.pdf b/slides/figs/parcours_larg_2.pdf new file mode 100644 index 0000000000000000000000000000000000000000..3bb12226cb5e56aeaa113e49aa19ed4bdff7209d Binary files /dev/null and b/slides/figs/parcours_larg_2.pdf differ diff --git a/slides/figs/parcours_larg_3.pdf b/slides/figs/parcours_larg_3.pdf new file mode 100644 index 0000000000000000000000000000000000000000..760e4f85347ad413917e2bfb4a5834c60d0d68aa Binary files /dev/null and b/slides/figs/parcours_larg_3.pdf differ diff --git a/slides/figs/parcours_larg_4.pdf b/slides/figs/parcours_larg_4.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f72eca842d5f5ad7a8971ffac255ddc3dde799a0 Binary files /dev/null and b/slides/figs/parcours_larg_4.pdf differ diff --git a/slides/figs/parcours_larg_5.pdf b/slides/figs/parcours_larg_5.pdf new file mode 100644 index 0000000000000000000000000000000000000000..47639cf66341094f8ace8d49da4fcd65cd9c4335 Binary files /dev/null and b/slides/figs/parcours_larg_5.pdf differ diff --git a/slides/figs/parcours_larg_6.pdf b/slides/figs/parcours_larg_6.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b45351eed368e06656de80228f703efd8c1e6b0a Binary files /dev/null and b/slides/figs/parcours_larg_6.pdf differ