Nella mia implementazione dell'algoritmo di Dijkstra ho 1 array con tutti i nodi e 1 coda di priorità con tutti i nodi. Ogni volta che un nodo viene rimosso dalla coda, aggiorno tutti i nodi adiacenti con una nuova distanza e da dove proviene, quindi posso tornare indietro del percorso.Algoritmo di Dijkstra con coda di priorità
Il nodo nella coda di priorità viene aggiornato con una nuova distanza e il nodo nell'array viene aggiornato da dove proviene e con nuova distanza. Quando un nodo viene rimossa dalla coda la distanza finale nella matrice viene aggiornata:
PathInfo current = pq.remove();
path[current.pos].distance = current.distance;
È accettabile aggiornare sia l'array con informazioni inerenti precedente nodo e la coda di priorità con la distanza?
Questo avviene ogni volta che viene trovata una distanza meglio:
PathInfo key(i, newDistance);
path[i].distance = newDistance;
path[i].previous = current.pos;
pq.decreaseKey(key);
Sembra un po 'ridondante per modificare il mio allineamento e coda di priorità con sostanzialmente le stesse informazioni.
Attualmente sto utilizzando un array normale come struttura dati nel PQ. L'aggiornamento della priorità viene eseguito in tempo lineare e la dequeue viene eseguita anche in tempo lineare.
Quale struttura dati dovrei usare nella coda di priorità e come dovrei cambiare la priorità di un nodo?
sto usando C++
Devo aggiornare le distanze nell'array. In quale altro modo dovrei confrontare se il nodo dal mio PQ può dare una distanza migliore ai nodi adiacenti? – Carlj901
Idealmente, dovresti essere in grado di cercarlo dal tuo PQ. Se questa operazione non è disponibile (e non può essere aggiunta all'implementazione PQ), sarà necessario mantenere le informazioni ridondanti. [Aggiungerò una sezione su questo alla mia risposta] – comingstorm
Il più preferibile sarebbe se potessi mantenere un heap nel mio PQ e avere una funzione di hash che mappa ogni nome di nodi (posizione nell'array 2D) alla sua distanza. Non sono sicuro di come avrei implementato questo però. – Carlj901