nodes.contains
имеет сложность времени в худшем случае в Θ(V)
, цикл for выполняется несколько раз в Θ(E)
и поэтому имеет сложность времени в худшем случае в Θ(V*E)
, Collections.min
имеет худший случайвременная сложность в Θ(V)
, поэтому тело цикла while имеет наихудшую временную сложность в Θ(V+V*E)
, но V+V*E
само по себе Θ(V*E)
(см. позже), поэтому тело цикла while имеет худший случайвременная сложность в Θ(V*E)
.Цикл while выполняется V
раз.Таким образом, наихудший случай выполнения алгоритма - Θ(V^2*E)
.
Упрощение там - замена Θ(V+V*E)
на Θ(V*E)
- приемлемо, потому что мы смотрим на общий случайV>1
.То есть V*E
всегда будет большим числом, чем V
, поэтому мы можем поглотить V
в ограниченно-постоянный коэффициент.Также было бы правильно сказать, что наихудшее время произнесено в Θ(V^2+E*V^2)
, но никто бы не использовал его, поскольку упрощенная форма более полезна.
Кстати, для интуиции вы можете вообщеигнорируйте эффект «использования» контейнеров во время алгоритма, например, с сортировкой вставок, имеющей все меньше и меньше элементов для просмотра, или этим алгоритмом, имеющим все меньше и меньше узлов для сканирования.Эти эффекты превращаются в постоянные факторы и исчезают.Только когда вы удаляете интересное число элементов каждый раз, например, с помощью алгоритма быстрого выбора или двоичного поиска, такие вещи начинают влиять на асимптотическое время выполнения.