L'algoritmo di Dijkstra è solo BFS con una coda prioritaria?


22

Secondo questa pagina , l'algoritmo di Dijkstra è solo BFS con una coda prioritaria. è davvero così semplice? Penso di no.


1
Perché lo pensi?
Raffaello

@Raphael Perché sembra troppo semplice, ed è: l'ho studiato di nuovo e vedo ora che non tiene traccia della distanza tra i nodi, quindi è davvero un BFS, non Dijkstra.
Barry Fruitman,

1
Beh, Dijkstra fa cambiare i valori della coda è "ordinata" con (spesso chiamato "rilassamento"); se lo proibisci, non è lo stesso, vero.
Raffaello

Risposte:


20

Puoi implementare l'algoritmo di Dijkstra come BFS con una coda prioritaria (sebbene non sia l'unica implementazione).

L'algoritmo di Dijkstra si basa sulla proprietà che il percorso più breve da a t sia anche il percorso più breve verso uno qualsiasi dei vertici lungo il percorso. Questo è esattamente ciò che fa BFS.st

O in un'altra prospettiva: come si comporterebbe l'algoritmo di Dijkstra se tutti i pesi fossero 1? Esattamente come BFS.


4

Innanzitutto, come possiamo adattare BFS a un grafico ponderato più generale ?G=(V,E)

Ecco un'idea dal libro "Algorithms (Sezione 4.4)" di Dasgupta et al:

e=(u,v)Elele1le1uv

GGG

GG

Gle

Terzo, come si comporta l'algoritmo Dijkstra su grafici non ponderati?

Si comporta esattamente come BFS. Elaboriamo questo da due punti principali.

  • Sul "rilassamento".

    Per l'algoritmo Dijkstra in generale, grafico ponderato, il rilassamento è

    for all edges (u,v) in E:
        if dist(v) > dist(u) + w(u,v)
           dist(v) = dist(u) + w(u,v)
    

    dist(v)=w(u,v)=1

    for all edges (u,v) in E:
        if dist(v) = \infty
           dist(v) = dist(u) + 1
    
  • Sulla "coda di priorità".

    Quando l'algoritmo Dijkstra viene eseguito su un grafico non ponderato, in qualsiasi momento, la coda di priorità contiene al massimo due valori distinti (distanza). Pertanto, è sufficiente una coda FIFO di BFS.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.