Почему временная сложность как DFS, так и 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
поэтому я думаю, что сложность времени будет:
v1 + (incident edges) + v2 + (incident edges) + .... + vn + (incident edges)
здесь v - это вершина 1 до n
во-первых, то, что я сказал правильно? Во-вторых, как это O(N + E), и интуиция относительно того, почему было бы действительно приятно. Спасибо
7 ответов:
ваша сумма
v1 + (incident edges) + v2 + (incident edges) + .... + vn + (incident edges)можно переписать в виде
(v1 + v2 + ... + vn) + [(incident_edges v1) + (incident_edges v2) + ... + (incident_edges vn)]и первая группа составляет
O(N)в то время как другойO(E).
DFS (анализ):
- установка / получение метки вершины / края занимает
O(1)времени- каждая вершина помечена дважды
- однажды как неизведанное
- один раз как посетил
- каждый край помечается дважды
- однажды как неизведанное
- один раз как открытие или обратно
- метод incidentEdges вызывается один раз для каждой вершины
- DFS работает в
O(n + m)время при условии, что график представлен структурой списка смежности- Напомним, что
Σv deg(v) = 2mBFS (анализ):
- установка/получение метки вершины / края занимает O (1) времени
- каждая вершина помечена дважды
- однажды как неизведанное
- один раз как посетил
- каждый край помечается дважды
- однажды как неизведанное
- один раз как открытие или Крест
- каждая вершина вставляется один раз в последовательность
Li- метод incidentEdges вызывается один раз для каждой вершины
- BFS работает в
O(n + m)время при условии, что график представлен структурой списка смежности- Напомним, что
Σv deg(v) = 2m
очень упрощено без особых формальностей: каждое ребро рассматривается ровно дважды, и каждый узел обрабатывается ровно один раз, поэтому сложность должна быть постоянной кратной числу ребер, а также числу вершин.
сложность времени
O(E+V)вместоO(2E+V)потому что если временная сложность равна n^2+2n+7, то она записывается как O(n^2).следовательно, O(2E+V) записывается как O (E+V)
потому что разница между n^2 и n имеет значение, но не между n и 2n.
Я думаю, что каждое ребро было рассмотрено дважды, и каждый узел был посещен один раз, поэтому общая сложность времени должна быть O(2E+V).
короткое, но простое объяснение:
в худшем случае вам нужно будет посетить все вершины и края, следовательно временная сложность в худшем случае равна O (V+E)
интуитивное объяснение этому заключается в простом анализе одного цикла:
- посетите вершину - > O (1)
- a для цикла на всех падающих ребрах - > O (e) где e-число ребер, падающих на заданную вершину v.
таким образом, общее время одного цикла составляет O(1)+О(Е). Теперь суммируйте его для каждой вершины, так как каждая вершина посещается один раз. Это дает
Sigma_i
p { height: 50px; line-height: 50px; } span { position: relative; font-size: 2.5em; display: inline-block; line-height: .7em; vertical-align: middle; } span:before { font-size: 12px; display: block; position absolute; left: 0; top: 0; content: "V"; width: 22px; text-align: center; } span:after { font-size: 12px; display: block; position absolute; left: 0; bottom: 0; content: "k = 1"; width: 27px; text-align: center; }<p> <span>Σ</span> O(1) + O(e) => <span>Σ</span> O(1) + <span>Σ</span> O(e) => O(V) + O(E) </p>[ O (1) + O (e)]