Что такое Big-O вложенного цикла, где количество итераций во внутреннем цикле определяется текущей итерацией внешнего цикла?
какова сложность времени Big-O следующих вложенных циклов:
for(int i = 0; i < N; i++)
{
for(int j = i + 1; j < N; j++)
{
System.out.println("i = " + i + " j = " + j);
}
}
будет O (N^2) до сих пор?
6 ответов
да. Вспомните определение Big-O:O(f (n)) по определению говорит, что время выполнения T (n) ≤ kf (n) для некоторой постоянной k. В этом случае количество шагов будет (n-1)+(n-2)+...+0, который перестраивается на сумму от 0 до n-1; это
T (n)=(n-1) ((n-1)+1)/2.
переставьте это, и вы увидите, что T (n) всегда будет ≤ 1/2 (n2); по определению, таким образом T(n) = O (n2).
Это N в квадрате, если вы игнорируете систему.из.метод println. Если вы предполагаете, что время, затраченное на это, будет линейным в его выходе (чего, конечно, может и не быть), я подозреваю, что вы получите O ( (N^2) * log N).
я упоминаю об этом, чтобы не быть придирчивым, но просто указать, что вам не просто нужно учитывать очевидные петли при разработке сложности - вам нужно посмотреть на сложность того, что вы называете.
Да, это будет N в квадрате. Фактическое количество шагов будет суммой от 1 до N, которая есть .5*(Н - 1)^2, Если я не ошибаюсь. О большим учитывает только высокий exponant и не константы, а значит, это еще н в квадрате.
Если вы имели N = 10, вы итераций будет: 10+9+8+7+6+5+4+3+2+1. (это: десять итераций плюс девять итераций плюс восемь итераций... так далее.).
теперь вам нужно найти в добавлении, сколько раз вы можете получить N (10 в Примере):
1:(10), 2:(9+1), 3:(8+2), 4:(7+3), 5:(6+4). То есть 5 раз... и отдыхает 5 итераций.
теперь вы знаете, что у вас есть пять десятков + 5:
10(5) + 5
в терминах f (n) (или N), мы легко можем видеть, что это будет:
f(n) = n (n/2) + n/2 = (n^2)/2 + n/2 = (n^2 + n)/2... в этом и заключается сложность вложенного цикла.
но, учитывая асимптотическое поведение большого O, мы можем избавиться от менее значимых значений f(n), которые являются единственным n и знаменателем.
результат: O (n^2)