递归算法的时间复杂度——公式法、递归树法

公式法

形如: f ( n ) = a f ( n / b ) + d ( n ) f(n)=af(n/b)+d(n) f(n)=af(n/b)+d(n)

①若d(n)为常数,则
f ( n ) = { O ( l o g n ) , a = 1 O ( n l o g b a ) , a ≠ 1 f(n)=\begin{cases} O(logn),&a=1 \\O(n^{log_ba}),&a≠1 \end{cases} f(n)={O(logn),O(nlogba),a=1a=1

②d(n)不为常数,则
f ( n ) = { O ( n ) , a < b O ( n l o g n ) , a = b O ( n l o g b a ) , a > b f(n)=\begin{cases} O(n) ,&ab \end{cases} f(n)=O(n),O(nlogn),O(nlogba),a<ba=ba>b

Notes:
1.公式中log的 l o g n logn logn的底数是省略的,因为n->∞,底数无论是何值都不影响最终的结果。
2.不满足公式法的递归方程则应采用递归树求时间复杂度,以上公式也均可以由递归树推导。

递归树法

下面用以一个例子来介绍递归树法。

T(n) = T(n/3) + T(2n/3) + n
*式子中,n是问题的规模
首先,通过表达式我们知道 T(n)的时间复杂度为T(n/3),T(2n/3)以及n的时间复杂度之和,可用如下树形表示:

递归算法的时间复杂度——公式法、递归树法_第1张图片
同理,T(n/3)=T(n/32)+T(22n/32)+n/3也以相同的形式表示在递归树中。以此类推,可得如下递归树:
递归算法的时间复杂度——公式法、递归树法_第2张图片

因为时间复杂度要考虑最坏情况,所以应选择树中最长的路径,即:
n->(2/3)n->(2/3)2n->(2/3)3n->……->(3/2)kn
递归树中叶子结点要化为1,所以(2/3)kn=1,可以得到 k = l o g 2 / 3 n k=log_{2/3}n k=log2/3n.

递归树上所有结点的总和为 n ( 1 + k ) = n ( l o g 3 / 2 n + 1 ) n(1+k)=n(log_{3/2}n+1) n(1+k)=n(log3/2n+1).
根据时间复杂度的渐进性质与加法原理,可得:f(n)的时间复杂度为O(nlogn)

本篇参考文章来源:http://www.cnblogs.com/wu8685/archive/2010/12/21/1912347.html

你可能感兴趣的:(算法,算法)