Что такое 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) ?

Да, он все еще O (n ^ 2), он имеет меньший постоянный коэффициент, но это не влияет на нотацию O.

Да. Напомним определение 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 (n²); по определению, таким образом, T (n) = O (n²) .

Это квадрат N, если вы игнорируете System.out.println. Если вы предполагаете, что время, затраченное на это, будет линейным в его выходе (что, конечно, это может быть не так, конечно), я подозреваю, что вы закончили с O ((N ^ 2) * log 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, начинающийся с внутреннего цикла через внешние, является адекватным способом вычисления сложности вложенных циклов. введите описание изображения здесь

Давайте будем гением компьютера.