Рассчитать большую сложность задачи разбиения - PullRequest
0 голосов
/ 23 февраля 2019

Мой псевдокод выглядит так:

solve(n)
    for i:= 1 to n do
       process(i);
       solve(n-i);

, где process(n) - функция с некоторой сложностью f(n).В моем случае f(n)=O(n^2), но меня также интересует общий случай (например, если f(n)=O(n)).

Итак, у меня есть T(n) = f(n) + ... + f(1) + T(n-1) + ... + T(1).Я не могу применить теорему Мастера, так как подзадачи имеют разный размер.

Как рассчитать сложность этой рекурсии?

1 Ответ

0 голосов
/ 26 февраля 2019

Небольшой трюк - рассмотрим solve(n-1):

solve(n)  :  T(n)   =  f(n) + f(n-1) + f(n-2) + ... + f(1) + T(n-1) + T(n-2) + ... + T(0)
solve(n-1):  T(n-1) =         f(n-1) + f(n-2) + ... + f(1) +          T(n-2) + ... + T(0)

Вычтите последнее из первого:

enter image description here

Расширяйте многократно:

enter image description here

Решите последнее суммирование для f(n), чтобы получить сложность.

, например, для f(n) = O(n):


Альтернативный метод - замена переменной:

enter image description here

S(m) в правильной форме для основной теоремы.

например, для f(n) = O(n) = O(log m), используйте Случай 2 с k = 0:

enter image description here

Тот же результат, qed

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...