Анализ сложности по сложности
Сложность времени для перемещения по смежным ребрам вершины называется O(N)
, где N - число соседних ребер. Таким образом, для V числа вершин сложность времени становится O(V*N)
= O(E)
, где E - общее количество ребер в графе. Поскольку удаление и добавление вершины из/в очередь равно O(1)
, почему она добавляется к общей временной сложности BFS как O(V+E)
.
Ответы
Ответ 1
Надеюсь, это поможет любому, кто не понимает сложность вычислительного времени для Breadth First Search a.k.a BFS.
Queue graphTraversal.add(firstVertex);
// This while loop will run V times, where V is total number of vertices in graph.
while(graphTraversal.isEmpty == false)
currentVertex = graphTraversal.getVertex();
// This while loop will run Eaj times, where Eaj is number of adjacent edges to current vertex.
while(currentVertex.hasAdjacentVertices)
graphTraversal.add(adjacentVertex);
graphTraversal.remove(currentVertex);
Сложность времени такова:
V * (O(1) + Eaj + O(1))
V + V * Eaj + V
2V + E(total number of edges in graph)
V + E
Я попытался упростить вычисление кода и сложности, но все же, если у вас есть какие-либо вопросы, дайте мне знать.
Ответ 2
Учитывая следующий график, мы видим, как сложность времени O (| V | + | E |), но не O (V * E).
![enter image description here]()
Список привязанностей
V E
v0:{v1,v2}
v1:{v3}
v2:{v3}
v3:{}
Операция Как работает BFS Шаг за шагом
Шаг 1:
Списки смежности:
V E
v0: {v1,v2} mark, enqueue v0
v1: {v3}
v2: {v3}
v3: {}
Шаг 2:
Списки смежности:
V E
v0: {v1,v2} dequeue v0;mark, enqueue v1,v2
v1: {v3}
v2: {v3}
v3: {}
Шаг 3:
Списки смежности:
V E
v0: {v1,v2}
v1: {v3} dequeue v1; mark,enqueue v3
v2: {v3}
v3: {}
Шаг 4:
Списки смежности:
V E
v0: {v1,v2}
v1: {v3}
v2: {v3} dequeue v2, check its adjacency list (v3 already marked)
v3: {}
Шаг 5:
Списки смежности:
V E
v0: {v1,v2}
v1: {v3}
v2: {v3}
v3: {} dequeue v3; check its adjacency list
Шаг 6:
Списки смежности:
V E
v0: {v1,v2} |E0|=2
v1: {v3} |E1|=1
v2: {v3} |E2|=1
v3: {} |E3|=0
Общее количество шагов:
|V| + |E0| + |E1| + |E2| +|E3| == |V|+|E|
4 + 2 + 1 + 1 + 0 == 4 + 4
8 == 8
Предположим представление списка смежности, V - число вершин, E - количество ребер.
Каждая вершина помещается в очередь и выгружается не более одного раза.
Сканирование всех смежных вершин занимает время O (| E |), так как сумма длин списков смежности | E |.
Следовательно, сложность времени BFS дает сложность времени O (| V | + | E |).
Ответ 3
Выполняя O(1)
операцию L
раз, результат в O(L)
сложности.
Таким образом, удаление и добавление вершины из/в очередь - O (1), но когда вы делаете это для вершин V
, вы получаете сложность O(V)
.
Поэтому O(V) + O(E) = O(V+E)
Ответ 4
I understood the part V+E in the complexity.
But I have 2 questions
1). V * Eaj should give 2E?
(as it is the total no of edges accessed, and each edge is checked twice, by each of it ends)
2) Also the complexity is V + E
but in worst case we take E = V*(V-1)/2
So V isn't required here as we could say we E = V²...
Can't we say complexity O(E) only?