2013-02-19 23 views
5

W mojej implementacji algorytmu Dijkstry mam 1 tablicę ze wszystkimi węzłami i jedną kolejkę priorytetową ze wszystkimi węzłami. Za każdym razem, gdy węzeł jest usuwany, aktualizuję wszystkie sąsiednie węzły o nową odległość i skąd pochodzi, więc mogę wycofać ścieżkę.Algorytm Dijkstry z kolejką priorytetową

Węzeł w kolejce priorytetów jest aktualizowany o nową odległość, a węzeł w tablicy jest aktualizowany, skąd przybył iz nową odległością. Kiedy węzeł jest rozkolejkowywana ostateczna odległość w tablicy jest aktualizowany:

PathInfo current = pq.remove(); 
    path[current.pos].distance = current.distance; 

Czy dopuszczalne jest, aby zaktualizować zarówno tablicę z informacją o poprzednim węzłem a kolejki priorytetowej z oddali?

Dzieje się tak, gdy odległość jest lepszy znaleziono:

 PathInfo key(i, newDistance); 
     path[i].distance = newDistance; 
     path[i].previous = current.pos; 
     pq.decreaseKey(key); 

Wydaje się nieco zbędny zaktualizować tablicę i kolejkę priorytetową z zasadniczo tej samej informacji.

Obecnie używam zwykłej tablicy jako struktury danych w PQ. Aktualizowanie priorytetu odbywa się w czasie liniowym, a puszczanie odbywa się również w czasie liniowym.

Jakiej struktury danych należy użyć w kolejce priorytetowej i jak zmienić priorytet węzłów?

Używam C++

Odpowiedz

1

Masz tutaj dwa rodzaje odległości: kolejka priorytetowa ma "odległości próbne", które podlegają aktualizacji, a twoja macierz ma "ostateczne odległości", które nie są (ponieważ algorytm Dijkstry nie musi aktualizować węzłów, które zostały usunięte z kolejki priorytetów).

Wygląda na to, że niepotrzebnie aktualizujesz odległości w swojej macierzy. Być może dobrze byłoby zmienić nazwę pola w węźle macierzy, aby to udokumentować: od arrayNode.distance do arrayNode.finalDistance.

Innymi słowy: wygląda na to, że używasz węzłów macierzy do wyprowadzenia wyników z algorytmu Dijkstry - więc powinieneś ustawić tylko odległość w każdym węźle tablicy, kiedy zostanie usunięta z kolejki priorytetów.


Jeśli realizacja priorytetów kolejka nie zapewnia zdolności do zapytania obecny dystans związany z danym kluczem, należy sprawdzić zachowanie jej funkcjonowania decreaseKey(). Jeśli operacja decreaseKey() odrzuca aktualizacje, dla których nowy priorytet nie zmniejsza się, nie powinieneś sam wykonywać tego sprawdzenia - możesz po prostu wywołać to dla każdego sąsiada bieżącego węzła.

Jeśli jednak funkcja decreaseKey() nie obsługuje poprawnie tego przypadku i nie ma funkcji zapytania pomocniczego, która pozwoliłaby na ręczne wykonanie tego sprawdzenia, a nie ma możliwości naprawienia którejkolwiek z nich, konieczne będzie zachowanie nadmiarowe informacje do tego celu ...

+0

Muszę zaktualizować odległości w tablicy. Jak inaczej mam się porównywać, czy węzeł z mojego PQ może dać lepszy dystans do sąsiednich węzłów? – Carlj901

+0

Idealnie powinieneś być w stanie wyszukać to ze swojego PQ. Jeśli ta operacja jest niedostępna (i nie można jej dodać do implementacji PQ), będziesz musiał zachować nadmiarowe informacje. [Dodam sekcję na ten temat do mojej odpowiedzi] – comingstorm

+0

Najbardziej preferowane byłoby, gdybym mógł utrzymać stertę w moim PQ i mieć funkcję mieszającą, która mapuje nazwę każdego węzła (pozycja w tablicy 2D) na jego odległość. Nie jestem pewien, jak to zrealizować. – Carlj901

0

struktur danych, które można użyć:

Może jakiś inny znaleźć minimalne w tablicy.

Po zaktualizowaniu priorytetu węzła należy również zsynchronizować preferowaną strukturę danych.

Uwaga: Jeśli użyto matrycy sprawdzić podłączony węzeł, może po prostu nie używać struktury danych, ponieważ nie zmienia algo złożoność będę nadal być O (n^2) (użyj bezpośredniego cykl znaleźć węzła z odpowiednim priorytetem) Struktura danych działa, gdy wykres ma wiele węzłów i niewielką liczbę połączeń i jest przechowywany jako lista połączonych węzłów (wyładowane wykresy)

+0

Jak zaktualizować priorytet węzłów w stercie? – Carlj901

+0

Należy przechowywać łącza do węzłów wewnątrz sterty i synchronizować te łącza, gdy węzły "poruszają się" wewnątrz sterty. –