Первый пункт терминологии, который вы, кажется, запутали.E
- это не количество элементов, это количество ребер между вершинами.V
- это число вершин, которое (в зависимости от контекста) может быть количеством элементов.
Далее, «эта вершина является соседом этой вершины» означает, что между ними есть ребро,Каждое ребро вносит 2 соседних отношения.(По одному в каждом направлении.) Следовательно, 2 E
- это количество соседних отношений, которые могут существовать, всего.
Ваша интуиция, что каждый из V
узлов может иметь до V-1
соседей в общей сложности.из V<sup>2</sup>-V
отношений с соседями верны, но вы можете определить, насколько вы близки к этому наихудшему случаю по числу ребер.
Поэтому мы получим следующую потенциальную работу:
for each of E edges:
for each vertex on that edge:
O(1) work to check whether it was processed yet
(processing the vertex if needed accounted for separately)
for each of V vertices:
O(log(V)) to add to the priority queue
O(log(V)) to remove from the priority queue
(processing its edges accounted for separately
Первый блок - O(E)
.Второй кусок - O(V log(V))
.Итого: O(E + V log(V))
.
Надеюсь, это объяснение проясняет, почему сложность такая, какая она есть.