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


Да, это все еще 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 (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)


AFAIL, начиная с внутреннего цикла через внешние, является адекватным способом вычисления сложности вложенного цикла. enter image description here