1.参考资料
参考网页:求递归算法时间复杂度:递归树
2.内容
递归算法时间复杂度的计算方程式是一个递归方程:
T
(
n
)
=
{
O
(
1
)
n
=
1
k
T
(
n
/
m
)
+
f
(
n
)
n
>
1
T(n) = \left\{ \begin{array}{ll} O(1) & n=1 \\ k T(n / m)+f(n) & n>1 \end{array} \right.
T(n)={O(1)kT(n/m)+f(n)n=1n>1
以
T
(
n
)
=
2
T
(
n
2
)
+
n
2
T(n) = 2T(\frac{n}{2})+n^{2}
T(n)=2T(2n)+n2为例,
K
=
2
,
m
=
2
,
f
(
n
)
=
n
2
K=2, m=2, f(n)=n^2
K=2,m=2,f(n)=n2
则其对应的递归树是:
树高应该考虑迭代结束的条件:
n
2
k
=
1
,
k
=
log
2
(
n
)
\frac{n}{2^{k}}=1,k=\log_2(n)
2kn=1,k=log2(n)
时间复杂度为所有节点和
n
2
+
1
2
n
2
+
1
4
n
2
+
⋯
=
2
n
2
=
O
(
n
2
)
n^2+\frac{1}{2}n^2+\frac{1}{4}n^2+\dots=2n^2=O(n^2)
n2+21n2+41n2+⋯=2n2=O(n2)
总结:递归树的规则是:
- 每层的节点为 k T ( n / m ) + f ( n ) k T(n / m)+f(n) kT(n/m)+f(n)中的 f ( n ) f(n) f(n)在当前 n m \frac{n}{m} mn下的值
- 每个节点的分支数为 k k k
- 可在当前层的右侧标出当前层中所有节点的和
利用递归树分析解递归算法复杂度,可以得到一些一般结论:
对递归式 f ( n ) = a f ( n b ) + d ( n ) f(n) = af(\frac{n}{b}) + d(n) f(n)=af(bn)+d(n)
1.当 d ( n ) d(n) d(n)为常数时:
f ( n ) = { O ( n log b a ) a ≠ 1 O ( log n ) a = 1 f(n)=\left\{\begin{array}{ll}O\left(n^{\log _{b} a}\right) & a \neq 1 \\ O(\log n) & a=1\end{array}\right. f(n)={O(nlogba)O(logn)a=1a=1
2.当 d ( n ) = c n d(n) = cn d(n)=cn时:
f ( n ) = { O ( n ) a < b O ( n log n ) a = b O ( n log b a ) a > b f(n)=\left\{\begin{array}{ll}O(n) & a<b \\ O(n \log n) & a=b \\ O\left(n^{\log _{b} a}\right) & a>b\end{array}\right. f(n)=⎩⎨⎧O(n)O(nlogn)O(nlogba)a<ba=ba>b
3.当 d ( n ) d(n) d(n)为其他情况可用递归树进行分析。
由第二种情况知,若采用分治法对原算法进行改进,则重点是采用新的计算方法缩小a的值。