Расчет временной сложности максимальной суммы подпоследовательности

Привет всем, я пытаюсь вычислить временную сложность максимальной суммы подпоследовательности. На самом деле я знаю ответ, который 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Вы должны быть более тщательными в своих расчетах и ​​позаботиться обо всех тех факторах, которые я просто опускал выше.

Проверьте это решение, предложенное Марком Алленом Вайсом (в его книге).

Другие вопросы по тегам