Временная сложность вложенного цикла for входит в математический вывод путем суммирования двух петель O (n2) сложности.
Я попытался выполнить упражнение, чтобы выяснить, как я могу получить O (n3) для следующих примеров трех вложенных циклов.
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
for (int k = 1; k <= n; k++)
print(i * k * j);
Суммирование
= (n + n + n + …. + n) + (n + n + n + … + n) + … + (n + n + n + … + n)
= n ^ 2 + n ^ 2 + …. + n ^ 2
n раз n ^ 2 = O (n ^ 3)
for(int i = 1; i <= n; i++)
for(int j = i; j <= n; j++)
for(int k = j; k <= n; k++)
print(i *j * k)
Вышеприведенное является довольно распространенной формой вложенных циклов, и я считаю, что суммирование будет выглядеть следующим образом
= (n + (n -1) + (n -2) + (n — 3) + … + 1)
+ ((n -1) + (n — 2) + (n — 3) + … + 1)
+ ((n -2) + (n -3) + (n — 4) + … + 1)
+ …
+ ((n — (n -2)) + 1)
= n (n — 1) / 2 + (n-1) (n -2) / 2 + (n-2) (n-3) / 2 + …. + 1
знак равно
Отсюда я немного не уверен, правильна ли моя логика. я верю
каждое из вышеперечисленных значений оценивается как многочлен, наибольшее значение которого равно n2, и, поскольку это то, что нам важно в сложности времени, вышеприведенное уравнение разбивается на.
= n ^ 2 + n ^ 2 + n ^ 2 + … + n ^ 2
= что n раз n ^ 2 = O (n ^ 3).
Правильно ли мое предположение?
for(int i = 1; i <= n; i++)
for(int j = 1; j <= i; j++)
for(int k = 1; k <= j; k++)
print(i *j * k)
Если бы вышеупомянутое было двумя вложенными циклами, суммирование было бы 1 + 2 + 3 + 4 + … + n. Тем не менее, для трех вложенных случаев я вывел его на
= 1 + (1 + 2) + (1 + 2 + 3) + (1 + 2 + 3) + (1 + 2 + 3 + …. + n)
Отсюда я не уверен, как получить O (n ^ 3) или как дальнейшее упрощение вышеупомянутого суммирования.
Используя тот факт, что:
1+2+3+...+i =i*(i+1)/2
, суммирование выше может быть записано как:
1*(1+1)/2 + 2*(2+1)/2 + ... + n*(n+1)/2
,
очевидно i*(i+1) > i^2
, следовательно:
1*(1+1)/2 + 2*(2+1)/2 + ... + n*(n+1)/2 > (1^2+...+ n^2)/2
, как мы знаем:
1^2+...+n^2 = n^3/3 + n^2/2 + n/6
(можно доказать это по индукции).
Поэтому первоначальная сумма S
больше чем:
n^3/6 + n^2/4 + n/12
, который O(n^3)
,
Других решений пока нет …