From ace19ddda6b0206a332986b741c4cbfebb16032e Mon Sep 17 00:00:00 2001 From: Orestis <orestis.malaspinas@pm.me> Date: Thu, 8 Jun 2023 20:32:51 +0200 Subject: [PATCH] added prim's algo --- slides/cours_25.md | 315 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 314 insertions(+), 1 deletion(-) diff --git a/slides/cours_25.md b/slides/cours_25.md index cce82d6..8deb43b 100644 --- a/slides/cours_25.md +++ b/slides/cours_25.md @@ -756,9 +756,322 @@ $$  +* Game over! + :::: ::: -* Game over! +# Algorithme de Prim + +## Structures de données + +* Dans quoi allons nous stocker les sommets? + +. . . + +* File de priorité min. +* Autre chose? + +. . . + +* Tableau des distances (comme pour Dijkstra). +* Autre chose? + +. . . + +* Tableau des parents (presque comme pour Dijkstra). +* Autre chose? + +. . . + +* Non. + +# Algorithme de Prim + +## Initialisation: Pseudo-code (2min) + +. . . + +```C +file_priorité, distance, parent initialisation(graphe) + r = aléatoire(graphe) + distance[r] = 0 + parent[r] = indéfini + fp = file_p_vide() + pour v dans sommets(graphe) + si v != r + distance[v] = infini + parent[v] = indéfini + fp = enfiler(fp, v, distance[v]) + retourne fp, distance, parent +``` + +# Algorithme de Prim + +## Algorithme: Pseudo-code (5min) + +. . . + +```C +sommets, parent prim(file_priorité, distance, parent) + sommets = vide + tant que !est_vide(file_priorité) + u, fp = défiler(file_priorité) + sommets = insérer(sommets, u) + pour v dans voisinage de u et pas dans sommets + // ou dans file_priorité + si w(u, v) < distance[v] + parent[w] = u + distance[w] = w(u, v) + fp = changer_priorité(fp, w, w(u, v)) + retourne sommets, parent +``` + +# Exemple d'algorithme de Prim + +::: columns + +:::: {.column width="40%"} + +## Un exemple + + + +:::: + +:::: column + +``` +FP | e | d | b | c | a | +---------------------------------- +D | 0 | inf | inf | inf | inf | + + | e | d | b | c | a | +---------------------------------- +P | - | - | - | - | - | +``` + +## Devient? + +. . . + +``` +FP | d | b | c | a | +---------------------------- +D | 4 | 5 | 5 | inf | + + | e | d | b | c | a | +---------------------------------- +P | - | e | e | e | - | +``` + +:::: + +::: + +# Exemple d'algorithme de Prim + +::: columns + +:::: {.column width="40%"} + +## Un exemple + + + +:::: + +:::: column + +``` +FP | d | b | c | a | +---------------------------- +D | 4 | 5 | 5 | inf | + + | e | d | b | c | a | +---------------------------------- +P | - | e | e | e | - | +``` + +## Devient? + +. . . + +``` +FP | a | c | b | +---------------------- +D | 2 | 4 | 5 | + + | e | d | b | c | a | +---------------------------------- +P | - | e | e | d | d | +``` + +:::: + +::: + +# Exemple d'algorithme de Prim + +::: columns + +:::: {.column width="40%"} + +## Un exemple + + + +:::: + +:::: column + +``` +FP | a | c | b | +---------------------- +D | 2 | 4 | 5 | + + | e | d | b | c | a | +---------------------------------- +P | - | e | e | d | d | +``` + +## Devient? + +. . . + +``` +FP | c | b | +---------------- +D | 4 | 5 | + + | e | d | b | c | a | +---------------------------------- +P | - | e | e | d | d | +``` + +:::: + +::: + +# Exemple d'algorithme de Prim + +::: columns + +:::: {.column width="40%"} + +## Un exemple + + + +:::: + +:::: column + +``` +FP | c | b | +---------------- +D | 4 | 5 | + + | e | d | b | c | a | +---------------------------------- +P | - | e | e | d | d | +``` + +## Devient? + +. . . + +``` +FP | b | +---------- +D | 5 | + + | e | d | b | c | a | +---------------------------------- +P | - | e | e | d | d | +``` + +:::: + +::: + +# Exemple d'algorithme de Prim + +::: columns + +:::: {.column width="40%"} + +## Un exemple + + + +:::: + +:::: column + +``` +FP | b | +---------- +D | 5 | + + | e | d | b | c | a | +---------------------------------- +P | - | e | e | d | d | +``` + +## Devient? + +. . . + +``` +FP | +---- +D | + + | e | d | b | c | a | +---------------------------------- +P | - | e | e | d | d | +``` + +:::: + +::: + +# Exercice: algorithme de Prim + +## Appliquer l'algorithme de Prim à (15min): + + + +# Exercice: algorithme de Prim + +## Solution + + + +# Complexité de l'algorithme de Prim + +\footnotesize + +```C +file_priorité, distance, parent initialisation(graphe) + // choix r et initialisation + pour v dans sommets(graphe) +O(|V|) // initialisation distance et parent + fp = enfiler(fp, v, distance[v]) + retourne fp, distance, parent +sommets, parent prim(file_priorité, distance, parent) + sommets = vide + tant que !est_vide(file_priorité) +O(|V|) u, fp = défiler(file_priorité) + sommets = insérer(sommets, u) + pour v dans voisinage de u et pas dans sommets + O(|E|) si w(u, v) < distance[v] + // mà j dista + parent + O(|V|) fp = changer_priorité(fp, w, w(u, v)) + retourne sommets, parent +``` +* $O(|V|)+O(|E|)+O(|V|^2)=O(|E|+|V|^2)$ +* Remarque: $O(|E|)$ n'est pas mutliplié par $O(|V|)$, car les arêtes parcourues qu'une fois en **tout**. -- GitLab