2013-09-04 14 views
9

Niektóre Pseudokod tutaj (lekceważyć mój styl)Dlaczego złożoność BFS O (V + E) zamiast O (V * E)?

Zaczynając od V1 (skolejkowany):

function BFS(queue Q) 
    v2 = dequeue Q 
    enqueue all unvisited connected nodes of v2 into Q 
    BFS(Q) 
end // maybe minor problems here 

Ponieważ istnieją V wierzchołków w grafie, a te V wierzchołki są połączone krawędziami E i odwiedzając coraz połączone węzły (równoważne odwiedzeniu połączonych krawędzi) znajdują się w wewnętrznej pętli (zewnętrzna pętla jest samą rekursją), wydaje mi się, że złożoność powinna być O (V * E), a nie O (V + E). Czy ktoś może mi to wyjaśnić?

+0

Bardzo uproszczona bez większego znaczenia: każdy edgy jest uważany dokładnie dwa razy, a każdy węzeł jest przetwarzany dokładnie jeden raz, więc złożoność musi być stałą wielokrotnością liczby krawędzi, a także liczbą wierzchołków. –

+0

Obejmuje to mechanizm unikania cykli. –

Odpowiedz

8

E to nie liczba krawędzi przylegających do każdego wierzchołka - faktycznie jest to całkowita liczba krawędzi na wykresie. Definiowanie go w ten sposób jest użyteczne, ponieważ niekoniecznie masz taką samą liczbę krawędzi na każdym pojedynczym wierzchołku.

Ponieważ każda krawędź zostanie odwiedzona raz do czasu zakończenia DFS, otrzymasz złożoność O (E) od tej części. Następnie dodajesz O (V) do odwiedzania każdego wierzchołka raz i otrzymujesz O (V + E) w sumie.

+3

Twoja odpowiedź jest nieco bardziej ogólna - może być związana zarówno z pierwszym wyszukiwaniem w systemie DFS, jak iz pierwszym wyszukiwaniem (BFS). Być może właśnie dlatego w twojej odpowiedzi źle ustawiłeś BFS jako DFS (zauważ, że pytanie dotyczyło BFS). – yasen

Powiązane problemy