2012-06-07 2 views
2

Как рассчитать время выполнения Тета этого данного кода: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) 
... 
+0

Подсказка: n^2 * (n-1)^2 * (n-2)^2 * ... = (n * (n-1) * (n-2) * ...)^2 –

+1

'f' не имеет возвращаемого значения, поэтому' f (n) 'не _equal_ ни к чему; примечание Big-Theta (также Big-O) связано с количеством операций, выполняемых при выполнении алгоритма – Attila

ответ

2

Поскольку каждый вложенный для цикла является O (N^2) сложность, и каждый раз при вызове функции внутри другой функции, сложность умножается, то вы в конечном итоге с O ((N!)^2), где N - это также количество повторений. Это, конечно, потому, что N! = N*(N-1)*(N-2)*...*(N-N+1), и все значения, используемые для создания факториала, являются квадратами.

1

Если заменить, что 3 с нуля (что, очевидно, ничего о & thetas не меняется), мы очень легко можем получить точное количество вызовов функции:

Θ е() = 1
Θ е (п) =п ⋅ Θ е (п -1)∀ п> 0

Таким образом, используя commutativeness продукта,

н п п
Θ е (п) = П J = П J ⋅ П J = п! ⋅ n!
я = 1 я = 1 я = 1
= (п!)

Как сказал Джейсон.

+0

Правильно ли выполняются пробелы? Это довольно хаки, я не хочу, чтобы LaTeX/MathJax под рукой. – leftaroundabout

Смежные вопросы