Les deux peuvent être implémentés en utilisant exactement le même algorithme générique comme suit:
Inputs:
G: Graph
s: Starting vertex (any for Prim, source for Dijkstra)
f: a function that takes vertices u and v, returns a number
Generic(G, s, f)
Q = Enqueue all V with key = infinity, parent = null
s.key = 0
While Q is not empty
u = dequeue Q
For each v in adj(u)
if v is in Q and v.key > f(u,v)
v.key = f(u,v)
v.parent = u
Pour Prim, passer f = w(u, v)
et pour le col de Dijkstra f = u.key + w(u, v)
.
Une autre chose intéressante est que ci-dessus Generic peut également implémenter Breadth First Search (BFS) même si cela serait excessif car une file d'attente prioritaire coûteuse n'est pas vraiment nécessaire. Pour passer au-dessus de l'algorithme générique en BFS, passezf = u.key + 1
ce qui équivaut à appliquer tous les poids à 1 (c'est-à-dire que BFS donne le nombre minimum d'arêtes nécessaires pour traverser du point A à B).
Intuition
Voici une bonne façon de penser à l'algorithme générique ci-dessus: Nous commençons avec deux compartiments A et B. Au départ, placez tous vos sommets dans B afin que le compartiment A soit vide. Ensuite, nous déplaçons un sommet de B vers A. Maintenant, regardez toutes les arêtes des sommets de A qui se croisent vers les sommets de B. A. Répétez ce processus jusqu'à ce que B soit vide.
Un moyen brutal d'implémenter cette idée serait de maintenir une file d'attente prioritaire des arêtes pour les sommets de A qui croise vers B. Évidemment, ce serait gênant si le graphe n'était pas clairsemé. La question serait donc de savoir si nous pouvons plutôt maintenir la file d'attente prioritaire des sommets? En fait, nous pouvons, car notre décision est finalement de savoir quel sommet choisir parmi B.
Contexte historique
Il est intéressant de noter que la version générique de la technique derrière les deux algorithmes est conceptuellement aussi vieille que 1930, même lorsque les ordinateurs électroniques n'existaient pas.
L'histoire commence avec Otakar Borůvka qui avait besoin d'un algorithme pour un ami de la famille essayant de comprendre comment connecter les villes du pays de Moravie (qui fait maintenant partie de la République tchèque) avec des lignes électriques à coût minime. Il a publié son algorithme en 1926 dans une revue liée aux mathématiques, car l'informatique n'existait pas à l'époque. Cela a attiré l'attention de Vojtěch Jarník qui a pensé à une amélioration de l'algorithme de Borůvka et l'a publié en 1930. Il a en fait découvert le même algorithme que nous connaissons maintenant comme l'algorithme de Prim qui l'a redécouvert en 1957.
Indépendamment de tout cela, en 1956, Dijkstra avait besoin d'écrire un programme pour démontrer les capacités d'un nouvel ordinateur que son institut avait développé. Il a pensé que ce serait cool d'avoir un ordinateur pour trouver des connexions pour voyager entre deux villes des Pays-Bas. Il a conçu l'algorithme en 20 minutes. Il a créé un graphique de 64 villes avec quelques simplifications (car son ordinateur était 6 bits) et a écrit le code pour cet ordinateur de 1956. Cependant, il n'a pas publié son algorithme parce qu'il n'y avait principalement pas de revues informatiques et il pensait que cela n'était peut-être pas très important. L'année suivante, il a appris le problème de la connexion des terminaux de nouveaux ordinateurs de telle sorte que la longueur des fils soit minimisée. Il réfléchit à ce problème et redécouvrit Jarník / Prim ' s algorithme qui utilise à nouveau la même technique que l'algorithme de chemin le plus court qu'il avait découvert un an auparavant. Ila mentionné que ses deux algorithmes ont été conçus sans utiliser de stylo ni de papier. En 1959, il a publié les deux algorithmes dans un article de seulement 2 pages et demie.