diff --git a/slides/cours_23.md b/slides/cours_23.md index a8ec3df91ce7f7b7184b345703aec82039126d2b..22329fd0429311c1ec8a3f45a888415851f9b3ab 100644 --- a/slides/cours_23.md +++ b/slides/cours_23.md @@ -17,7 +17,7 @@ Les graphes * Existe-t-il une promenade sympa, passant **une seule fois** par les 7 ponts et revenant au point de départ? -{width=40%} +{width=40%} . . . @@ -27,7 +27,7 @@ Les graphes ## Réseau social -{width=40%} +{width=40%} * Chaque sommet est un individu. * Chaque trait une relation d'amitié. @@ -37,11 +37,11 @@ Les graphes ## Moteurs de recherche -{width=40%} +{width=40%} -* Sommet est un site. -* Liens sortants; -* Liens entrants; +* Site est un sommet. +* Liens sortants. +* Liens entrants. * Notion d'importance d'un site: combien de liens entrants, pondérés par l'importance du site. * Miam, Miam, Google (PageRank). @@ -75,7 +75,8 @@ Les graphes ## Notations * Une arête d'un graphe **non-orienté** est représentée par une paire **non-ordonnée** $(u,v)=(v,u)$, avec $u,v\in V$. -* Les arêtes ne sont pas orientées dans un graphe non-orienté (elles sont bi-directionnelles, peuvent être parcourues dans n'importe quel ordre). +* Les arêtes ne sont pas orientées dans un graphe non-orienté +(elles sont bi-directionnelles, c.-à-d. peuvent être parcourues dans n'importe quel sens). ## Exemple @@ -147,7 +148,7 @@ E&=\{(1,2),(2,3),(2,4),(4,1),(4,2)\},\\ ## Définition * Le somme $v$ est **adjacent** au sommet $u$, si et seulement si $(u,v)\in E$; -* Si un graphe non-orienté contient une arête $(u,v)$, $v$ est adjacent à $u$ et $u$ et adjacent à $v$. +* Si un graphe non-orienté contient une arête $(u,v)$, $v$ est adjacent à $u$ et $u$ est adjacent à $v$. ## Exemple @@ -161,7 +162,7 @@ E&=\{(1,2),(2,3),(2,4),(4,1),(4,2)\},\\ :::: column -{width=60%} +{width=60%} :::: @@ -191,17 +192,17 @@ avec $k$ la longueur de la chaîne (le nombre d'arêtes du chemin). ## Exemples -{width=80%} +{width=80%} # Généralités ## Définition -* Une **chaîne élémentaire** est une chaîne dont tous les sommets sont distincts, sauf les extrémités qui peuvent être égales +* Une **chaîne élémentaire** est une chaîne dont tous les sommets sont distincts, sauf les extrémités qui peuvent être égales. ## Exemples -{width=80%} +{width=80%} # Généralités @@ -211,7 +212,7 @@ avec $k$ la longueur de la chaîne (le nombre d'arêtes du chemin). ## Exemples -{width=40%} +{width=40%} # Généralités @@ -227,12 +228,12 @@ avec $k$ la longueur de la chaîne (le nombre d'arêtes du chemin). :::: column -{width=60%} +{width=60%} :::: :::: column -{width=40%} +{width=40%} :::: @@ -269,12 +270,12 @@ avec $k$ la longueur de la chaîne (le nombre d'arêtes du chemin). ## Définition * Un **cycle** dans un graphe *non-orienté* est une chaîne de longueur $\geq 3$ telle que le 1er sommet de la chaîne est le même que le dernier, et dont les arêtes sont distinctes. -* Pour un graphe *orienté* on parle de **circuit**. +* Pour un graphe *orienté*, on parle de **circuit**. * Un graphe sans cycles est dit **acyclique**. ## Exemples -{width=100%} +{width=100%} # Question de la mort @@ -289,7 +290,7 @@ avec $k$ la longueur de la chaîne (le nombre d'arêtes du chemin). * La complexité des algorithmes sur les graphes s'expriment en fonction du nombre de sommets $V$, et du nombre d'arêtes $E$: * Si $|E|\sim |V|^2$, on dit que le graphe est **dense**. * Si $|E|\sim |V|$, on dit que le graphe est **peu dense**. -* Selon qu'on considère des graphes denses ou peu denses, différentes structure de données peuvent être envisagées. +* Selon qu'on considère des graphes denses ou peu denses, différentes structures de données peuvent être envisagées. ## Question @@ -461,7 +462,7 @@ $$ . . . -* $\mathcal{O}(|V|^2)$. +* $\mathcal{O}(|V|^2)$ * Quel est l'espace nécessaire pour stocker une matrice d'adjacence pour un graphe non-orienté? . . . @@ -488,7 +489,7 @@ $$ # La liste d'adjacence (non-orienté) -* Pour chaque sommet $v\in V$, stocker les sommets adjacents à $v$- +* Pour chaque sommet $v\in V$, stocker les sommets adjacents à $v$. * Quelle structure de données pour la liste d'adjacence? . . . @@ -573,31 +574,31 @@ graph LR; . . . $$ -\mathcal{O}(|E|) +\mathcal{O}(|V|+|E|) $$ -* Pour les graphes *non-orientés*: $\mathcal{O}(2|E|)$. -* Pour les graphes *orientés*: $\mathcal{O}(|E|)$. +* Pour les graphes *non-orientés*: $\mathcal{O}(|V|+2|E|)$. +* Pour les graphes *orientés*: $\mathcal{O}(|V|+|E|)$. ## Définition * Le **degré** d'un sommet $v$, est le nombre d'arêtes incidentes du sommet (pour les graphes orientés on a un degré entrant ou sortant). -* Comment on retrouve le degré de chaque sommet avec la liste d'adjacence? +* Comment retrouve-t-on le degré de chaque sommet avec la liste d'adjacence? . . . -* C'est la longueur de la liste chaînée. +* C'est la longueur de la liste chaînée si le graphe est non-orienté. # Parcours * Beaucoup d'applications nécessitent de parcourir des graphes: - * Trouver un chemin d'un sommet à un autre; - * Trouver si le graphe est connexe; + * trouver un chemin d'un sommet à un autre; + * trouver si le graphe est connexe. * Il existe *deux* parcours principaux: * en largeur (Breadth-First Search); * en profondeur (Depth-First Search). -* 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). +* Ces parcours créent *un arbre* au fil de l'exploration (si le graphe est non-connexe, cela crée une *forêt*, c.-à-d. un ensemble d'arbres). # Illustration: parcours en largeur @@ -621,13 +622,13 @@ $$ ## Étape par étape (vert à visiter) -{width=50%} +{width=50%} # Exemple ## Étape par étape -{width=50%} +{width=50%} ## Étape par étape @@ -718,7 +719,7 @@ pour sommet dans graphe et sommet non-visité ## Remarque -* `i` est la distance de plus cours chemin entre `v` et les sommets en cours de visite. +* `i` est la distance de plus court chemin entre `v` et les sommets en cours de visite. # Le parcours en largeur @@ -729,27 +730,28 @@ pour sommet dans graphe et sommet non-visité . . . -* Utilisation d'une **file** +* Utilisation d'une **file d'attente** . . . ```C initialiser(graphe) // tous sommets sont non-visités -file = visiter(sommet, vide) // sommet est un sommet du graphe au hasard +visiter(sommet, file) // on choisit un sommet de départ tant que !est_vide(file) - v = défiler(file) - file = visiter(v, file) + défiler(file, (v,u)) + si u != visité + ajouter (v,u) à l'arbre T + visiter(u, file) ``` ## Que fait visiter? ``` -file visiter(sommet, file) - sommet = visité - pour w = chaque arête de sommet +rien visiter(x, file) + marquer x comme visité + pour chaque arête (x,w) si w != visité - file = enfiler(file, w) - retourne file + enfiler(file, (x,w)) ``` # Exercice (5min) @@ -765,7 +767,7 @@ file visiter(sommet, file) ## Étape 1 -* Extraire un sommet de la file; +* Extraire un sommet de la file. ## Étape 2 @@ -775,9 +777,9 @@ file visiter(sommet, file) . . . -* Étape 1: $\mathcal{O}(|V|)$, -* Étape 2: $\mathcal{O}(2|E|)$, -* Total: $\mathcal{O}(|V| + |2|E|)$. +* Étape 1: $\mathcal{O}(|V|)$ +* Étape 2: $\mathcal{O}(2|E|)$ +* Total: $\mathcal{O}(|V| + |2|E|)$ # Exercice @@ -807,7 +809,7 @@ graph LR; * Initialiser les sommets comme non-lus * Visiter un sommet -* Pour chaque sommet visité, on visite un sommet adjacent s'il est pas encore visité récursivement. +* Pour chaque sommet visité, on visite un sommet adjacent s'il est pas encore visité, récursivement. ## Remarque @@ -820,11 +822,13 @@ graph LR; . . . ```C -initialiser(graphe) // tous sommets sont non-visités -pile = visiter(sommet, vide) // sommet est un sommet du graphe au hasard +initialiser(graphe) // tous les sommets sont non-visités +visiter(sommet, pile) // on a choisit un sommet du graphe tant que !est_vide(pile) - v = dépiler(pile) - pile = visiter(v, pile) + dépiler(pile, (v,u)) + si u != visité + ajouter (v,u) dans l'arbre T + visiter(u, pile) ``` ## Que fait visiter? @@ -832,12 +836,11 @@ tant que !est_vide(pile) . . . ```C -pile visiter(sommet, pile) - sommet = visité - pour w = chaque arête de sommet +rien visiter(x, pile) + marquer x comme visité + pour chaque arête (x,w) si w != visité - pile = empiler(pile, w) - retourne pile + empiler(pile, (x,w)) ``` @@ -860,9 +863,9 @@ graph LR; # Interprétation des parcours -* Un graphe vu comme espace d'états (sommet: état, arête: action); - * Labyrinthe; - * Arbre des coups d'un jeu. +* Un graphe vu comme espace d'états (sommet: état, arête: action) + * Labyrinthe + * Arbre des coups d'un jeu . . .