两种都是优化搜索的方法
记忆化搜索:
属于动态规划的一种实现方式
记忆化搜索主要用于递归中,是优化递归搜索的重要方法
记忆化搜索就是将每次处理的结果储存起来,不让其重复计算
比如斐波那契数列:
int fbnq(int e)
{
if(e == 1 || e == 2) return 1;
else return fbnq(e-1) + fbnq(e-2);
}
其中在计算一个超级大数位的斐波那契数时,会重复计算很多次其他的数
比如当计算10时
首先会计算9,8;而计算9又需要计算8,7;
其中8被计算了两次,如果有一个数组记录其结果,就只需要计算一次就可以了
unordered_map<int,int> m;
int fbnq(int e)
{
if(e == 1 || e == 2) return 1;
if(m.find(e) == m.end()) m[e] = fbnq(e-1) + fbnq(e-2);
return m[e];
}
经过unordered_map优化后显然更迅速
剪枝优化:
剪枝是优化搜索的重要方法
就是在搜索中及时止损,以防不必要的计算。
剪枝主要分为可行性剪枝和最优化剪枝
可行性剪枝:是指在搜索过程中判断路径是否能产生结果,如果不能就直接结束
最优化剪枝:是指判断该路径是否能比当前最优路线更优,如果不能就结束
总的来说:剪枝就是增加一定条件(可行性,最优化)来让程序提前结束,以降低时间复杂度