欢迎光临散文网 会员登陆 & 注册

递归 or 记忆化搜索?谁更优秀?文末有惊喜~~

2023-08-27 17:33 作者:bili_31175665658  | 我要投稿

前言


在动态规划中,我们通常使用二维数组来存储子问题的最优解,但是对于某些问题,如果使用二维数组存储所有子问题的解,可能会造成空间复杂度过高。


这个时候我们可以考虑使用**记忆化搜索**来优化空间复杂度。



算法介绍


记忆化搜索实际上是用递归来实现的,但是在递归的过程中有许多结果是被反复计算的,这样会大大降低算法的执行效率。


而记忆化搜索是在递归的过程中,将已经计算出来的结果保存起来,当之后的计算再次用到时直接取出结果,避免重复运算,因此极大的提高了算法的效率。


举个例子,比如「斐波那契数列」的定义是:f(0) = 0, f(1) = 1, f(n) = f(n - 1) + f(n - 2)。如果我们使用递归算法求解第 n 个斐波那契数,则对应的递推过程如下图所示:



从图中可以看出:如果使用普通递归算法,想要计算 f(5),需要先计算 f(3) 和 f(4),而在计算 f(4) 时还需要计算 f(3)。这样 f(3) 就进行了多次计算,同理 f(0)、f(1)、f(2) 都进行了多次计算,从而导致了重复计算问题。


为了避免重复计算,在递归的同时,我们可以使用一个缓存(数组或哈希表)来保存已经求解过的 f(k) 的结果。如上图所示,当递归调用用到 f(k) 时,先查看一下之前是否已经计算过结果,如果已经计算过,则直接从缓存中取值返回,而不用再递推下去,这样就避免了重复计算问题。


使用记忆化搜索方法解决斐波那契数列的代码如下:

写在最后


记忆化搜索是一种常见的动态规划优化方法,可以避免重复计算,提高算法效率。在使用记忆化搜索时,我们可以将递归算法与缓存技术结合起来,通过缓存子问题的解来避免重复计算,从而节省时间和空间复杂度。


最后送大家一份 JetBrains IDEA 破解教程和干货,快拿去用吧:

百度网盘链接:https://pan.baidu.com/s/1jxvnKgTsTbkVmjcPGeTm0g

提取码:2cg8  

 


递归 or 记忆化搜索?谁更优秀?文末有惊喜~~的评论 (共 条)

分享到微博请遵守国家法律