Qu'est-ce que Algorithme de Dijkstra ?

Algorithme qui trouve les plus courts chemins d'un sommet de départ vers tous les sommets d'un graphe dont les poids des arêtes sont supérieurs ou égaux à 0. Il fixe de façon répétée le sommet le plus proche dont la distance n'est pas encore définitive et met à jour les distances de ses voisins. Il ne fonctionne pas correctement avec des poids d'arêtes négatifs.

Nom japonais: ダイクストラ法

« Algorithme de Dijkstra » apparaît dans 3 questions d'entraînement réparties sur 1 thèmes, dont Structures de données et algorithmes.

Domaine: Structures de données et algorithmes

Procédure

On fixe la distance du départ à 0 et celle de tous les autres sommets à l'infini, et on marque tous les sommets comme non définitifs. On prend le sommet non définitif de plus petite distance, on le rend définitif et, pour chaque arête qui en part, on met à jour la distance du sommet à l'autre extrémité si « distance définitive + poids de l'arête » est inférieur à sa distance actuelle (relâchement). On répète jusqu'à ce que tous les sommets soient définitifs. En enregistrant le sommet précédent à chaque mise à jour, on peut ensuite retracer le plus court chemin lui-même.

Complexité et files de priorité

Chercher à chaque fois le minimum parmi tous les sommets prend O(V²) pour V sommets. Utiliser une file de priorité fondée sur un tas binaire ramène ce coût à O((V + E) log V), où E est le nombre d'arêtes, ce qui est bien plus rapide pour les graphes creux comme les réseaux routiers. Le graphe est généralement stocké sous forme de listes d'adjacence. Les systèmes de navigation automobile le combinent avec la recherche A*, qui ajoute une estimation de la distance restante pour orienter la recherche vers la destination, et avec des techniques d'accélération qui utilisent des informations précalculées.

Poids négatifs et autres algorithmes

L'algorithme de Dijkstra rend les sommets définitifs en supposant que passer par d'autres sommets ne peut qu'allonger une distance, jamais la raccourcir. Avec des arêtes négatives, une distance définitive peut ensuite devenir plus courte, si bien que des réponses correctes ne sont pas garanties. En présence de poids négatifs, on utilise l'algorithme de Bellman-Ford, qui relâche toutes les arêtes V−1 fois et peut aussi détecter les cycles négatifs. Pour les plus courts chemins entre toutes les paires de sommets, on utilise aussi l'algorithme de Floyd-Warshall (O(V³)), fondé sur la programmation dynamique. Dans le routage réseau, les protocoles à état de liens comme OSPF utilisent l'algorithme de Dijkstra dans chaque routeur pour calculer les routes.

S'entraîner : questions sur Algorithme de Dijkstra

Dans un graphe non orienté, les poids des arêtes (distances) sont S−A : 4, S−B : 1, A−B : 2, A−C : 1, B−C : 5, C−T : 3 et A−T : 6. Quelle réponse donne le plus court chemin de S à T trouvé par l'algorithme de Dijkstra et sa longueur ?

  1. AS→A→C→T, longueur 8
  2. BS→B→A→C→T, longueur 7
  3. CS→B→C→T, longueur 9
Afficher la réponse et l'explication

Réponse : B. S→B→A→C→T, longueur 7

L'algorithme de Dijkstra fixe de façon répétée le sommet le plus proche dont la distance n'est pas encore définitive, puis met à jour les distances de ses voisins. Depuis S (0), B est fixé à 1, et passer par B donne à A une distance de 1 + 2 = 3, plus courte que les 4 du trajet direct. Fixer A (3) donne à C 3 + 1 = 4 et à T 3 + 6 = 9, et fixer C (4) met à jour T à 4 + 3 = 7. Le plus court chemin est donc S→B→A→C→T, de longueur 7. S→A→C→T (8) est plus long parce qu'il prend directement S−A, et S→B→C→T (9) parce que B−C a un poids élevé de 5.

Quelle condition sur le graphe est nécessaire pour que l'algorithme de Dijkstra trouve des plus courts chemins corrects ?

  1. ALe graphe n'a pas de cycles (chemins qui reviennent au même sommet)
  2. BLes arêtes ne sont pas orientées
  3. CTous les poids des arêtes sont supérieurs ou égaux à 0
Afficher la réponse et l'explication

Réponse : C. Tous les poids des arêtes sont supérieurs ou égaux à 0

L'algorithme de Dijkstra fixe le sommet non encore fixé dont la distance est la plus petite. Il repose sur l'hypothèse que passer par d'autres sommets ne peut qu'allonger une distance, jamais la raccourcir. Avec une arête négative, une distance peut devenir plus courte plus tard par un autre chemin ; par exemple, dans un graphe orienté avec S→A 2, S→B 3 et B→A −2, A est fixé à 2 avant que le chemin S→B→A de longueur 1 soit trouvé. En présence de poids négatifs, on utilise l'algorithme de Bellman-Ford ou une méthode similaire. L'algorithme de Dijkstra fonctionne avec des cycles et des arêtes orientées, pourvu que tous les poids soient supérieurs ou égaux à 0.

Questions fréquentes

Quel est le lien entre l'algorithme de Dijkstra et le parcours en largeur ?

Si toutes les arêtes ont un poids de 1, l'algorithme de Dijkstra rend les sommets définitifs dans le même ordre que le parcours en largeur. On peut le voir comme une généralisation à des poids différents, qui remplace la file d'attente par une file de priorité renvoyant d'abord la plus petite distance.

Peut-on utiliser l'algorithme de Dijkstra sur des graphes orientés ?

Oui. Tant que les poids sont supérieurs ou égaux à 0, il trouve des plus courts chemins corrects dans les graphes orientés comme non orientés, y compris ceux qui ont des cycles.

« Algorithme de Dijkstra » dans les explications

Questions mentionnant « Algorithme de Dijkstra » (3)

  1. Dans un graphe non orienté, les poids des arêtes (distances) sont S−A : 4, S−B : 1, A−B : 2, A−C : 1, B−C : 5, C−T : 3 et A−T : 6. Quelle réponse donne le plus court chemin de S à T trouvé par l'algorithme de Dijkstra et sa longueur ?
  2. Quelle condition sur le graphe est nécessaire pour que l'algorithme de Dijkstra trouve des plus courts chemins corrects ?
  3. Quelle est une façon appropriée de stocker en mémoire un graphe creux, c'est-à-dire un graphe ayant peu d'arêtes par rapport à son nombre de sommets, comme un réseau routier d'environ 1 million de sommets et 3 millions d'arêtes ?

Termes associés

Parcours en largeur (breadth-first search) Algorithme glouton (greedy) Arbre binaire de recherche (binary search tree) Complexité temporelle (notation grand O) File d'attente Liste chaînée (linked list) Parcours en profondeur (depth-first search) Pile (stack) Programmation dynamique Recherche dichotomique (recherche binaire)

Retour au glossaire