Algorithmes et structures de données avancés Cours 9 Patrick Reuter http://www.labri.fr/~preuter • Programme : – Rappel dernier TP – Algorithme glouton – Complexité Graphe orienté ponderé • G = (V,E,φ) Aφ= 0 64 94 ∞ ∞ 64 0 47 78 ∞ 94 47 0 65 197 ∞ 78 65 0 193 ∞ ∞ 197 193 0 • Rappel dernier TP – Trouver le plus court chemin de s1 à s2 dans un graphe complet pondéré avec n sommets – Essayer toutes les chaînes – Complexité factorielle Théorie de la complexité Classes de Grand-O • • O(1) O(log n) complexité constante complexité logarithmique • O(n) complexité linéaire • O(n log n) complexité quasi-linéaire • O(na) complexité polynomiale – – • • O(n2) O(n3) O(an) O(n!) complexité quadratique complexité cubique complexité exponentielle complexité factorielle O(log n) O(n) O(n log n) O(n2) O(n3) O(an) O(n!) Théorie de la complexité – Changement de la fonction 2ème solution changer la fonction O(n) • O(log n) logarithmique • O(n) linéaire • O(n log n) Quasi-linéaire • O(n2) quadratique • O(n3) cubique • O(an) exponentiel n • Est-ce qu’il y a une meilleure méthode pour trouver le plus court chemin de s1 à s2 ? • Pour certaines problèmes, les algorithmes gloutons peuvent trouver la meilleur permutation plus vite Algorithmes gloutons • Les algorithmes gloutons (ou voraces, en anglais : greedy) construisent une solution de façon incrémentale, en choisissant à chaque étape la direction qui est la plus prometteuse. • Ce choix localement optimal n'a aucune raison de conduire à une solution globalement optimale. Labyrinthe 1 2 3 4 1 2 3 (1,1) Labyrinthe (2,1) 1 2 3 4 1 2 3 (1,1) Labyrinthe (2,1) (2,2) 1 2 3 4 1 2 3 (3,1) (1,1) Labyrinthe (2,1) (2,2) 1 (3,1) (3,2) 2 (3,3) 3 (2,3) (3,4) 4 1 2 3 (1,3) (2,4) Algorithme glouton 1 2 3 4 1 2 3 (1,3) (2,4) (1,1) Labyrinthe (2,1) (2,2) 1 (3,1) (3,2) 2 (3,3) 3 (2,3) (3,4) 4 1 2 3 (1,3) (2,4) Algorithme retour sur trace (anglais : « Backtracking ») • Le retour sur trace consiste à revenir légèrement en arrière sur des décisions prises afin de sortir d'un blocage. La méthode des essais et erreurs (anglais : trial and error) constitue un exemple simple de backtracking. (1,1) Labyrinthe (2,1) (2,2) 1 (3,1) (3,2) 2 (3,3) 3 (2,3) (3,4) 4 1 2 3 (1,3) (2,4) • Cependant, certains problèmes peuvent être résolus avec des algorithmes gloutons, comme par exemple les plus courts chemins avec l’algorithme de Dijkstra. Algorithme de Dijkstra • L'algorithme de Dijkstra résout le problème du plus court chemin pour un graphe G(V,E, φ) orienté et connexe dont le poids lié aux arcs est positif ou nul. • On peut prendre pour exemple le réseau routier d'une région: chaque sommet est une ville, chaque arc est une route dont le poids est en fait le kilométrage: l'algorithme de Dijkstra permet alors de trouver le plus court chemin d'une ville à une autre. Algorithme de Dijkstra • L'algorithme porte le nom de son inventeur Edsger Dijkstra. • Edsger Dijkstra (Rotterdam, 11 mai 1930 Nuenen, 6 août 2002) était un mathématicien et informaticien néerlandais du XXe siècle Algorithme de Dijkstra • {M3 toujours défini implicitement en tant que V \ ( M1 UNION M2) } • • • pour chaque v de V Distance(v) := infini; fin pour • • • M1 := {s}; M2 := {}; Distance(s) := 0; • • • • pour chaque arc (s,v) de E avec v de V Distance(v) := Poid(s,v) M2 := M2 UNION {v} fin pour • • • • • • • • • • • • • tant que l'ensemble M2 n'est pas vide choisir le v de M2 avec Distance(v) minimal M2 := M2 \ {v} M1 := M1 UNION {v} pour chaque (v,w) de E avec w de V si w dans M3 alors M2 = M2 UNION {w} Distance(w) := Distance(v) + Poid(v,w); sinon si Distance(w) > Distance(v) + Poid(v,w) Distance(w) := Distance(v) + Poid(v,w) fin si fin pour fin tant que alors Graphe orienté ponderé • G = (V,E,φ) Aφ= 0 64 94 ∞ ∞ 64 0 47 78 ∞ 94 47 0 65 197 ∞ 78 65 0 193 ∞ ∞ 197 193 0 Algorithme de Dijkstra Ensembles M1 {} M2 Distances M3 s1 s2 s3 s4 s5 0 ∞ ∞ ∞ ∞ Algorithme de Dijkstra • Si le graphe possède m arcs et n sommets, quelle est la complexité de l'algorithme ? Algorithme de Dijkstra • L'algorithme de Dijkstra pourra être mis en œuvre efficacement en stockant le graphe sous forme de listes d'adjacence et en utilisant un tas comme une file à priorités (Fibonacci-Heap) pour trouver la distance minimale. • Si le graphe possède m arcs et n sommets, alors la complexité de l'algorithme est Θ(m + n log n) Algorithme de Dijkstra • Appartient à la famille des algorithmes gloutons. Algorithmes gloutons • Les algorithmes gloutons (ou voraces, en anglais : greedy) construisent une solution de façon incrémentale, en choisissant à chaque étape la direction qui est la plus prometteuse. • Ce choix localement optimal n'a aucune raison de conduire à une solution globalement optimale. • Cependant, certains problèmes peuvent être résolus ainsi, comme par exemple les plus courts chemins avec l’algorithme de Dijkstra.