Определите время выполнения поиска в ширину для графа, в котором V вершин и E рёбер.
Время поиска в ширину
Код
from collections import deque
def distances(graph: dict[str, list[str]], start: str) -> dict[str, int]:
dist = {start: 0}
queue = deque([start])
while queue:
node = queue.popleft()
for friend in graph.get(node, []):
if friend not in dist:
dist[friend] = dist[node] + 1
queue.append(friend)
return distКакое время выполнения?
Ответ: O(V + E)
Каждая вершина попадает в очередь не больше одного раза: проверка friend not in dist (хеш-таблица, O(1)) не пускает её повторно. Это даёт O(V). Внутренний цикл проходит по списку соседей каждой вершины один раз, а в сумме это все рёбра — O(E). Итого O(V + E): ни одно слагаемое нельзя отбросить, в разреженном графе рёбер мало, в плотном — очень много.
- Подсказка 1
Сколько раз каждая вершина попадает в очередь? Здесь dist одновременно служит множеством проверенных.
- Подсказка 2
Сколько раз всего выполняется тело внутреннего цикла for, если сложить по всем вершинам?