汉诺塔问题和递归树

汉诺塔

3根圆柱a、b、c,其中a上面串了n个圆盘。这些圆盘从上到下是按从小到大顺序排列的,大的圆盘任何时刻不得位于小的圆盘上面。每次移动一个圆盘,最终将所有圆盘移动到c上,该如何移动?

该问题的算法描述如下: 

参数n代表问题的规模,耗时用T(n)表示,规模为n-1时的耗时为T(n-1)。当规模为1时,只需要移动一步即可,耗时为O(1)。当规模大于1时,先将n-1个圆盘移动到b,耗时T(n-1);然后将剩下的1个圆盘移动到c,耗时O(1);最后将n-1个圆盘移动到c,耗时T(n-1)。故汉诺塔问题的时间复杂度递推方程如下: 

令c=O(1),用迭代法求解过程如下:

故算法hanoi的时间复杂度为O(2n)。

递归树

递归树是迭代过程的一种图像表述,常被用于求解递推方程,它的求解表示比一般的迭代会更加的简洁与清晰。

递归树是迭代计算的模型,它的生成过程与迭代过程一致,递归树上所有项恰好是迭代之后产生和式中的项,对递归树上的项求和就是迭代后方程的解。不妨设递推方程的一般形式为: 

其中,n为原问题的规模;mk(k=1,2,…,i)为划分的子问题的规模;f(n)表示分解子问题和归并子问题的解为原问题的解所消耗的总时间。

递归树生成规则如下: 

(1) 初始时递归树只有根节点T(n); 

(2) 将递归项叶节点的迭代式T(n)表示成二层子树,父节点为递归前分解子问题和递归后归并子问题的解消耗的时间f(n),子节点为子问题的递归项T(mi),i=1,2,…,i。该操作一直持续到无递归项为止。

【例1-18】根据二分查找算法的时间复杂度递推方程,用递归树求解二分查找的时间复杂度。

解:第一步,递归树中只有T(n),如图1-3所示。

第二步,将递归项T(n)表示成两层子树,用两层子树代替T(n),令c=O(1),如图1-4所示。

■ 图1-3根节点                  ■ 图1-4两层子树代替根节点

第三步,将递归项T(n/2)表示成两层子树,用两层子树代替T(n/2),如图1-5所示。

以此类推,直到没有递归项为止,如图1-6所示。

二分查找算法的时间复杂度为clog2n,即O(log2n)。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

N._

piu~打个赏吧

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

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

打赏作者

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

抵扣说明:

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

余额充值