diff --git a/slides/cours_25.md b/slides/cours_25.md index eb6e6a086ac21280888899823c93201e91ebbefe..ec0426651a039b94c3fc76cf3502b85c92fb2332 100644 --- a/slides/cours_25.md +++ b/slides/cours_25.md @@ -487,9 +487,47 @@ distance, précédent dijkstra(graphe, s, t): retourne distance, précédent ``` +# Algorithme de Dijkstra avec file + +\footnotesize + +```C +distance dijkstra(graphe, s, t) +--------------------------------------------------------- + pour v dans sommets(graphe) +O(V) si v != s + distance[v] = infini +O(V) fp = enfiler(fp, v, distance[v]) // notre impl est nulle +------------------O(V * V)------------------------------- + tant que !est_vide(fp) +O(V) u, fp = défiler(fp) +--------------------------------------------------------- +O(E) pour v dans voisinage de u + n_distance = distance[u] + w(i, v) + si n_distance < distance[v] + distance[v] = n_distance +O(V) fp = changer_priorité(fp, v, n_distance) +--------------------------------------------------------- + retourne distance +``` + +* Total: $\mathcal{O}(|V|^2+|E|\cdot |V|)$: + * Graphe dense: $\mathcal{O}(|V|^3)$ + * Graphe peu dense: $\mathcal{O}(|V|^2)$ + +# Algorithme de Dijkstra avec file + +## On peut faire mieux + +* Avec une meilleure implémentation de la file de priorité: + * Tas binaire: $\mathcal{O}(|V|\log|V|+|E|\log|V|)$. + * Tas de Fibonnacci: $\mathcal{O}(|V|+|E|\log|V|)$ +* Graphe dense: $\mathcal{O}(|V|^2\log|V|)$. +* Graphe peu dense: $\mathcal{O}(|V|\log|V|)$. + # Algorithme de Dijkstra (exercice, 5min) - +{width=60%} * Donner la liste de priorité, puis... @@ -535,3 +573,4 @@ distance, précédent dijkstra(graphe, s, t): * L'algorithme n'essaiera jamais le chemin `s->x->y->v` et prendra direct `s->v`. * Ce problème n'apparaît que s'il y a des poids négatifs. +