Cours 9

publicité
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.
Téléchargement