Да, они все O (п), и да, ваши уравнения для T
верны.
В общем, в то время как T
полезен для ознакомления с анализом сложности, в противном случае он не используется. Большинство людей обеспокоены проблемой O
. Кроме того, как только вы найдете набор алгоритмов с минимальным (или оптимальным) O
, проблема нахождения наилучшего из этого набора редко зависит от T
. Это связано с тем, что такие вещи, как, например, когерентность кэша, обычно имеют большее значение, чем абсолютное количество сравнений или дополнений для большинства практических проблем.
Если взять две петли:
for (i = 0; i < n; i++) {}
и
for (i = 0; i <= n; i++) {}
Нижняя петля будет выполнять еще один раз, чем верхний (он будет выполняться, когда i == n
, в то время как верхняя петля будет пропускать это). Поэтому при вычислении времени выполнения они различны. Верхний будет выполнять сравнение/приращение n
раз точно (когда i
- {0,1,...,n-1}
); нижняя часть будет исполнять его n+1
(когда i
- {0,1,...,n-1,n}
).
Однако в примечаниях Big-O вы ищете асимптотическое поведение - то есть то, что происходит с n
, действительно велико. И в этом случае вы принимаете только коэффициент n
, который отличается самым быстрым. Когда n
очень большой, дополнительная итерация цикла выше не имеет большого значения, поэтому обе петли: O(n)
.
Одним из ключевых моментов, которые следует учитывать при записи Big-O, является то, что он определенно не захватывает все, что связано с алгоритмом. Это хорошая проверка первого прохода - алгоритм, который равен O(n)
, почти всегда будет лучше, чем тот, который равен O(n^3)
. Но в пространстве алгоритмов с одним и тем же - или почти одинаковым - экспонентом, при реализации на реальных системах может быть совершенно разная производительность.
Немного сложно. Итак: «i
Wyvern666
Отличное редактирование. Благодарю. – Wyvern666