Jaki jest najszybszy algorytm znajdowania wszystkich najkrótszych ścieżek na rzadkim wykresie?


24

Na nieważonym wykresie bezkierunkowym z wierzchołkami i krawędziami E, takimi jak 2 V > E , jaki jest najszybszy sposób znalezienia wszystkich najkrótszych ścieżek na wykresie? Czy można to zrobić szybciej niż Floyd-Warshall, który jest O ( V 3 ), ale bardzo szybki na iterację?VE2V>EO(V3)

Co powiesz na ważenie wykresu?

Odpowiedzi:


32

Ponieważ jest to wykres nieważony, można uruchomić pierwsze wyszukiwanie szerokości (BFS) z każdego wierzchołka na wykresie. Każde uruchomienie BFS daje najkrótsze odległości (i ścieżki) od wierzchołka początkowego do każdego innego wierzchołka. Złożoność czasowa dla jednego BFS wynosi O ( V + E ) = O ( V ), ponieważ E = O ( V ) na twoim rzadkim wykresie. Uruchamianie go V razy daje złożoność czasową O ( V 2 ) .vO(V.+mi)=O(V.)mi=O(V.)V.O(V.2))

W przypadku ważonego grafu kierunkowego algorytm Johnsona, sugerowany przez Yuvala, jest najszybszy dla grafów rzadkich. Wymaga które w twoim przypadku okazuje się być O ( V 2 log V ) . W przypadku ważonego niekierowanego wykresu można uruchomić algorytm DijkstryO(V.2)logV.+V.mi)O(V.2)logV.)z każdego węzła lub zamień każdą nieukierowaną krawędź na dwie przeciwnie skierowane krawędzie i uruchom algorytm Johnsona. Oba będą dawały takie same czasy aysmptotyczne jak powyższy algorytm Johnsona dla twojego rzadkiego przypadku. Zauważ też, że wspomniane powyżej podejście BFS działa zarówno dla grafów skierowanych, jak i niekierowanych.



7

Możesz spróbować stworzyć wersję Floyd-Warshall, która będzie szybsza na rzadkich matrycach.

Najpierw przypomnijmy sobie, co robi ten algorytm:

Niech będzie macierzą odległości. Na początku algorytmu M í , j jest waga krawędzi i j . Jeśli to krawędź nie istnieje wówczas M I , J = .M.M.ja,jotjajotM.ja,jot=

Algorytm ma kroków. W kroku k algorytmu dla każdej pary węzłów i , j ustawiamyV.kja,jot

M.ja,jotmin{M.ja,jot,M.ja,k+M.k,jot}.

M.ja,k=M.k,jot=remisoljan(k)remisolout(k)remisoljan(k)remisolout(k)kM.

k

mi=O(V.)k=0O(1)M.O(V.)k=|V.|O(V.2))O(V.3))

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.