秒懂算法 | 递推方程求解方法

举报
TiAmoZhang 发表于 2023/03/07 15:18:12 2023/03/07
【摘要】 时间复杂度和空间复杂度表示为递推方程的两种求解方法。

640.jpg

01、迭代法

迭代法就是迭代的方式展开方程的右边,直到没有可以迭代的项为止,这时通过对右边的和进行估算来估计方程的解。

下面给出一个用迭代法求解的例子。
【例1】汉诺塔问题

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

该问题的算法描述如下:

640.png


参数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)。故汉诺塔问题的时间复杂度递推方程如下:

640.png


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

640.png


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


02、递归树

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

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

640.png


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


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

(2) 将递归项叶节点的迭代式T(n)表示成二层子树,父节点为递归前分解子问题和递归后归并子问题的解消耗的时间f(n),子节点为子问题的递归项T(mi),i=1,2,…,i。该操作一直持续到无递归项为止。
【例2】根据二分查找算法的时间复杂度递推方程,用递归树求解二分查找的时间复杂度。

640.png


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


第二步,将递归项T(n)表示成两层子树,用两层子树代替T(n),令c=O(1),如图3所示。
640.png
■ 图2根节点 ■ 图3两层子树代替根节点

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

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

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

640.png


■ 图4两层子树代替T(n/2) ■ 图5递归树

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。