2015-04-15 2 views
1

Я путаюсь с сложностью BFS. Википедия говорит: «Сложность времени может быть выражена как O (| V | + | E |), так как каждая вершина и каждое ребро будут изучены в худшем случае».Худший случай времени работы BFS

set start vertex to visited 

load it into queue 

while queue not empty 

    for each edge incident to vertex 

     if its not visited 

      load into queue 

      mark vertex 

Для меня худший случай: каждая вершина связана со всеми вершинами Таким образом, цикл, пока будет сделан V раза и в течение времени цикла Е. Худший сценарий 0 (VE).

Что я сделал не так?

+0

E - все ребра на графике. Итак, в вашем примере, | E | = | V | * (| V | - 1). – Mats

ответ

0

Сложность времени BFS равна O (| V | + | E |). V - количество полной вершины, а E - число общего ребра. Вы можете ошибочно принять за E. E не соседние ребра вершины u.

Мы можем реализовать это, как показано ниже.

для каждой функции и в вершинах

для каждых е в соседе (и)

do something. 
+0

В вашем втором цикле: «для каждого e в соседе (u)», если сосед u - все вершины (в случае всех вершин связаны со всеми другими вершинами). Разве мы не находимся в O (VE)? – GermainGum

+0

E - число общего ребра в этом графе. E - это не число ребер с вершиной в графе. Таким образом, O (VE) означает, что вершина, связанная с другой вершиной с полными ребрами. Это неверно. – BokukPark

+0

Когда мы переходим к вершине, нам не нужно проверять все ребра. Мы просто проверяем соседние края вершины. – BokukPark

2

Целью BFS является посетить все узлы один раз. Никакая вершина никогда не попадает в очередь во второй раз (что объясняет | V |). | E | суммирования исходит из предположения, что проверка краев инцидентов ничего не стоит по сравнению с посещением. Итак, да, для полного графа (все вершины связаны со всеми другими вершинами) будут проверены края VE ... но проверка их не стоит посещения.

+0

Я согласен с вами, что посещение стоит «больше», чем проверка. Но это раздражает меня, для меня, когда мы говорим о сложности, мы не должны смотреть, если вы посетите> проверку. Строго говоря, проверка O (1) и проверка + посещение также O (1). Это похоже на то, что мы не учитываем всю итерацию, где проверка ложна. Если это так, то это должно быть точным. В любом случае, спасибо за ваш ответ;). – GermainGum

Смежные вопросы