Какова сложность времени 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)?
Какова сложность времени 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)?
Да, он все еще O (n ^ 2), он имеет меньший постоянный коэффициент, но это не влияет на нотацию O.
Да. Напомним определение Big-O: O (f (n)) по определению говорит, что время выполнения T (n) ≤ kf (n) для некоторой константы k. В этом случае число шагов будет (n-1) + (n-2) +... + 0, которое перестраивается до суммы от 0 до n-1; это
Т (п) = (п-1) ((п-1) + 1)/2.
Переупорядочивайте это, и вы можете видеть, что T (n) всегда будет ≤ 1/2 (n & sup2;); по определению, таким образом, T (n) = O (n & sup2;).
Это квадрат N, если вы игнорируете System.out.println. Если вы предполагаете, что время, затраченное на это, будет линейным в его выходе (чего, конечно, это не может быть, конечно), я подозреваю, что вы закончили с O ((N ^ 2) * log N).
Я упоминаю, что это не придирчиво, а просто указать, что вам нужно не просто учитывать очевидные циклы при разработке сложности - вам нужно посмотреть на сложность того, что вы называете.
Да, это было бы N квадрата. Фактическое количество шагов было бы суммой от 1 до N, которая равна .5 * (N - 1) ^ 2, если я не ошибаюсь. Big O учитывает только самый высокий показатель экспоненты и константы, и, таким образом, это все еще квадрат N.
Если у вас было 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... это в точности сложность этих вложенный цикл.
Но, учитывая асимптотическое поведение Big O, мы можем избавиться от менее значимых значений f (n), которые являются единственным n и знаменателем.
Результат: O (n ^ 2)
AFAIL, начатый из внутреннего цикла через внешние, является адекватным способом вычисления сложности вложенного цикла.