Тета время выполнения рекурсии
Как рассчитать время исполнения Theta для данного кода:
void f(int n)
{
for (int i=3; i<n; ++i)
for (int j=0; j<i; ++j)
f(n-1);
}
Пока что я получил это, но я не знаю, правильно ли это или как перенести это в тета-нотацию.
f(n) = n^2 * f(n-1)
f(n) = n^2 * (n-1)^2 * f(n-2)
f(n) = n^2 * (n-1)^2 * (n-2)^2 * f(n-3)
...
2 ответа
Поскольку каждый вложенный цикл for имеет сложность O(N^2), и каждый раз, когда вы вызываете функцию внутри другой функции, сложность умножается, в результате вы получаете O((N!)^2), где N
также количество раз, которое вы повторяете. Это конечно потому что N! = N*(N-1)*(N-2)*...*(N-N+1)
и все значения, используемые для создания факториала, возводятся в квадрат.
Если мы заменим эти 3 на ноль (что, очевидно, ничего не меняет в Θ), мы можем очень легко получить точное количество вызовов функций:
Θf (1) = 1
Θf (n) = n2 Θ Θf (n-1) ∀ n > 0
Итак, используя коммутативность продукта,
н н н н
Θf (n) = ∏ j 2 = ∏ j ⋅ ∏ j = n! ⋅ н!
я = 1 я = 1 я = 1
= (n!)2
Как сказал Джейсон.