首页 > Java > java教程 > 正文

使用动态规划查找斐波那契数

WBOY
发布: 2024-07-17 00:12:31
原创
519 人浏览过

本节分析并设计了一种使用动态规划查找斐波那契数的有效算法。第18.3节,案例研究:计算斐波那契数,给出了查找斐波那契数的递归方法,如下:

/**求斐波那契数列的方法*/
公共静态长 fib(长索引){
if (index == 0) // 基本情况
返回 0;
else if (index == 1) // 基本情况
返回 1;
else // 归约和递归调用
返回 fib(索引 - 1) + fib(索引 - 2);
}

我们现在可以证明这个算法的复杂度是O(2^n)。为了方便起见,设索引为n。令 T(n) 表示查找 fib(n) 的算法的复杂度,c 表示将索引与 01 进行比较的常数时间;也就是说,T(1) 和 T(0) 是 c。因此,

Image description

与汉诺塔问题的分析类似,我们可以证明T(n)是O(2^n)。

但是,这个算法效率不高。是否有一种有效的算法来查找斐波那契数?递归 fib 方法的问题在于该方法使用相同的参数进行冗余调用。例如,要计算 fib(4),将调用 fib(3)fib(2)。为了计算 fib(3),需要调用 fib(2)fib(1)。请注意,fib(2) 被冗余调用。我们可以通过避免使用相同参数重复调用 fib 方法来改进它。请注意,新的斐波那契数是通过将序列中的前两个数相加而获得的。如果使用两个变量 f0f1 来存储前面的两个数字,则可以通过添加 f0 立即获得新数字 f2 f1。现在,您应该通过将 f1 分配给 f0 并将 f2 分配给 f1 来更新 f0f1 ,如下图。

Image description

新方法在下面的代码中实现。

Image description

输入斐波那契数列的索引:6
索引 6 处的斐波那契数是 8

输入斐波那契数列的索引:7
索引 7 处的斐波那契数是 13

显然,这个新算法的复杂度是O(n)。这是对递归 O(2^n) 算法的巨大改进。

这里介绍的计算斐波那契数的算法使用了一种称为动态规划的方法。动态规划是解决子问题,然后组合子问题的解以获得总体解决方案的过程。这自然会导致递归解决方案。然而,使用递归效率很低,因为子问题重叠。动态规划背后的关键思想是只解决每个子问题一次,并将子问题的结果存储起来供以后使用,以避免子问题的冗余计算。

以上是使用动态规划查找斐波那契数的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!