Entrambi possono essere implementati utilizzando esattamente lo stesso algoritmo generico come segue:
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
Per Prim, pass f = w(u, v)
e per Dijkstra pass f = u.key + w(u, v)
.
Un'altra cosa interessante è che sopra Generic può anche implementare Breadth First Search (BFS) anche se sarebbe eccessivo perché la costosa coda di priorità non è realmente richiesta. Per trasformare l'algoritmo generico in BFS, passare f = u.key + 1
che equivale a imporre tutti i pesi a 1 (cioè BFS fornisce il numero minimo di bordi necessari per attraversare dal punto A a B).
Intuizione
Ecco un buon modo per pensare all'algoritmo generico di cui sopra: iniziamo con due bucket A e B. Inizialmente, mettete tutti i vertici in B in modo che il bucket A sia vuoto. Quindi spostiamo un vertice da B ad A. Ora guarda tutti i bordi dai vertici in A che attraversano i vertici in B. Abbiamo scelto un bordo usando alcuni criteri da questi bordi incrociati e spostiamo il vertice corrispondente da B a A. Ripeti questo processo fino a quando B è vuoto.
Un modo brute force per implementare questa idea sarebbe quello di mantenere una coda di priorità dei bordi per i vertici in A che attraversa fino a B. Ovviamente ciò sarebbe problematico se il grafico non fosse sparso. Quindi la domanda sarebbe: possiamo invece mantenere la coda di priorità dei vertici? Questo in effetti possiamo come la nostra decisione alla fine è quale vertice scegliere da B.
Contesto storico
È interessante notare che la versione generica della tecnica alla base di entrambi gli algoritmi è concettualmente vecchia del 1930 anche quando i computer elettronici non erano in circolazione.
La storia inizia con Otakar Borůvka che aveva bisogno di un algoritmo per un amico di famiglia che cercava di capire come collegare le città nel paese della Moravia (ora parte della Repubblica Ceca) con linee elettriche a costo minimo. Pubblicò il suo algoritmo nel 1926 in una rivista di matematica, poiché allora l'informatica non esisteva. Questo portò all'attenzione di Vojtěch Jarník che pensò a un miglioramento dell'algoritmo di Borůvka e lo pubblicò nel 1930. Scoprì infatti lo stesso algoritmo che ora conosciamo come algoritmo di Prim che lo riscoprì nel 1957.
Indipendentemente da tutto ciò, nel 1956 Dijkstra aveva bisogno di scrivere un programma per dimostrare le capacità di un nuovo computer sviluppato dal suo istituto. Ha pensato che sarebbe stato bello avere un computer per trovare i collegamenti per viaggiare tra due città dei Paesi Bassi. Ha progettato l'algoritmo in 20 minuti. Ha creato un grafico di 64 città con alcune semplificazioni (perché il suo computer era a 6 bit) e ha scritto il codice per questo computer del 1956. Tuttavia non ha pubblicato il suo algoritmo perché principalmente non c'erano riviste di informatica e pensava che questo potesse non essere molto importante. L'anno successivo venne a conoscenza del problema del collegamento di terminali di nuovi computer in modo tale da ridurre al minimo la lunghezza dei fili. Ha pensato a questo problema e ha riscoperto Jarník / Prim ' s algoritmo che utilizza ancora la stessa tecnica dell'algoritmo del percorso più breve che aveva scoperto un anno prima. Luiha detto che entrambi i suoi algoritmi sono stati progettati senza utilizzare carta o penna. Nel 1959 pubblicò entrambi gli algoritmi in un articolo di sole 2 pagine e mezzo.