Расчет временной сложности максимальной суммы подпоследовательности
Привет всем, я пытаюсь вычислить временную сложность максимальной суммы подпоследовательности. На самом деле я знаю ответ, который O(n^3), и это следует из функции (n^3 + 3n^2 + 2n)/6
У меня вопрос, как эта функция получается.
3 ответа
Вот как..
i=0
j=0 k=0 (count=1 )
j=1 k=0,1 (count =2)
j=2 k=0,1,2 (count = 3)
...
j=n-1 k=0,1,2,...n-1 (count = n)
Total number of times code executed = 1+2+3+...+n = n(n+1)/2
i=1
j=1 k=1 (count=1 )
j=2 k=1,2 (count =2)
j=3 k=1,2, 3 (count = 3)
...
j=n-1 k=1,2,...n-1 (count = n-2)
Total number of times code executed = 1+2+3+...+n-1 = (n-1)n/2
...
i=n-1
j=n-1 k=n-1 ( count = 1)
Total number of of times code executed = 1 = 1(1+1)/2
Now if we sum for all the values of i
n(n+1)/2 + ((n-1)((n-1)+1)/2+.....+1(1+1)/2
=∑ N(N+1)/2 =1/2∑(N^2 +N) =1/2(∑N^2+∑N)=1/2{ 1/6 N(N+1)(2N+1) + 1/2 N(N+1) } =1/2{ (2N^3 + 3N^2+N )/6 +(N^2+N)/2} =(N^3 + 3N^2 + 2N)/6
На самом деле все просто: просто посмотрите на циклы в коде.
for (int i=0; i<n; i++)
for(j = i; j<n; j++) {
...
for (int k=i; k<=j; k++)
XXX;
Линия XXX
выполняется n^3
раз (по модулю некоторый постоянный фактор и некоторые более низкие степени n
), поскольку внешний цикл явно 0
в n-1
"средний" цикл начинается с i
(который начнется с 0
, 1
...) чтобы n-1
Это означает, что внутренний цикл будет запущен n^2
раз. Теперь оба i
а также j
зависит от n
(например., i
будет 0
а также j=n-1
в конце первой внешней итерации), поэтому строка XXX
будет n
раз (для внутреннего цикла) n^2
раз (для внешних двух петель), в результате чего в общей сложности n^3
,
Чтобы получить конкретную функцию (n^3 + 3n^2 + 2n)/6
Вы должны быть более тщательными в своих расчетах и позаботиться обо всех тех факторах, которые я просто опускал выше.
Проверьте это решение, предложенное Марком Алленом Вайсом (в его книге).