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

公式法

形如: 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) ,&a<b \\O(nlogn),&a=b \\O(n^{log_ba}),&a>b \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的时间复杂度之和,可用如下树形表示:

在这里插入图片描述
同理,T(n/3)=T(n/32)+T(22n/32)+n/3也以相同的形式表示在递归树中。以此类推,可得如下递归树:
在这里插入图片描述

因为时间复杂度要考虑最坏情况,所以应选择树中最长的路径,即:
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

  • 5
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

萘和

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值