关于记忆化搜索,算法中还是搜索的步骤,记忆化搜索:算法上依然是搜索的流程,但是搜索到的一些解用动态规划的那种思想和模式作一些保存。
但是动态规划总的来说是递归(循环或者其他形式)的遍历所有情况,就会造成很多不必要的数据冗余。
就拿最经典的斐波那契数列为例:
斐波那契数列是数学家列昂纳多·斐波那契(Leonardoda Fibonacci[1] )以兔子繁殖为例子而引入,也称为“兔子数列”。
指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……
在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2,n∈N*)
由于递归在计算过程中非常慢,造成了很多不必要的冗余。
以求第五项为例:
而记忆化搜索正是可以对搜索剪枝,可能剪去大量不必要的状态,因此在空间开销上往往比动态规划要低很多。
记忆化算法在求解的时候还是按着自顶向下的顺序,但是每求解一个状态,就将它的解保存下来,
以后再次遇到这个状态的时候,就不必重新求解了。这种方法综合了搜索和动态规划两方面的优点,因而还是很有实用价值的。
过程是:
1.建立一个数组,初始化为-1(因为n=0时,值也为0.)用来记忆斐波那契数列。
2.在递归调用前加一个条件,判断数组中是否已经有数值,如果有数值,则不符合条件,返回数组的第n项,如果没有数值if(shu[n]==-1),则调用递归函数!
大家可以这样试试你之前调试的斐波那契数列,利用这个小技巧,能让你的空间开销小很多很多,之前递归的算法是O(2^n)的,加上后立刻变为线性阶了。亲测有效