博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
记忆化搜索(例)
阅读量:6977 次
发布时间:2019-06-27

本文共 995 字,大约阅读时间需要 3 分钟。

前言:记忆化搜索是在递归的基础上进行优化,这种方法综合了搜索和动态规划两方面的优点。

记忆化搜索的思想是:在搜索过程中,会有很多重复计算,如果我们能记录一些状态的答案,就可以减少重复搜索量

实现方式

①定义好一个数组,用来存储递归所求出来的值,以便接下来进行访问;

②在主程序里,memset一下,一般都是赋初值为-1,然后把这个数组的边界值设置好;

③在递归函数里,首先加一句:if (这个数组的值>=0) return 这个值【如果赋初值为-1的话,一般都是>=0】;其次,在后面的递归调用中,先给这个数组赋值,再return。

代码加持

int f[1000]int count(int n){if(f[n]) return f[n];//调取结果if(n==1) return 1;//边界int val=0;for(int i=1;i<=n/2;++i)val+=count(i);f[n]=val+1;//存取结果return f[n];}//val是变量

记忆化搜索的适用范围

    根据记忆化搜索的思想,它是解决重复计算,而不是重复生成,也就是说,这些搜索必须是在搜索扩展路径的过程中分步计算的题目,也就是“搜索答案与路径相关”的题目,而不能是搜索一个路径之后才能进行计算的题目,必须要分步计算,并且搜索过程中,一个搜索结果必须可以建立在同类型问题的结果上,也就是类似于动态规划解决的那种。

也就是说,他的问题表达,不是单纯生成一个走步方案,而是生成一个走步方案的代价等,而且每走一步,在搜索树/图中生成一个新状态,都可以精确计算出到此为止的费用,也就是,可以分步计算,这样才可以套用已经得到的答案.

 号 外 号 外并不是所有算法都适用哦!

使用条件

  • 对于一定状态有唯一相同的解,不应对于一个状态有多个解(解不相同);
  • 到达底层时可立即返回解,不应得出路径后才能计算解;
  • 状态数量和规模应能够在有限数据结构中存储。

TIP

  • 遵循无后效性原则//某阶段的状态一旦确定,则此后过程的演变不再受此前各种状态及决策的影响。
  • 局限性:可十分简洁的优化为递归,即动态规划。
  • 往往对于dfs才会使用记忆化,因为bfs并不会重复搜索到某一个状态,而一旦搜索到结果就是最优解,此时立即退出;

 

转载于:https://www.cnblogs.com/zcy0917/p/9316487.html

你可能感兴趣的文章
httpd: apr_sockaddr_info_get() failed for centossvn
查看>>
《Head First 统计学》读书笔记
查看>>
vim配置C++博文整理
查看>>
深入解析Windows操作系统笔记——CH1概念和术语
查看>>
来玩Play框架07 静态文件
查看>>
include和require的区别
查看>>
NuGet 无法连接到远程服务器-解决方法
查看>>
按键驱动的恩恩怨怨之概述
查看>>
第22周二
查看>>
数位dp(求1-n中数字1出现的个数)
查看>>
html传參中?和&amp;
查看>>
AMD and CMD are dead之js模块化黑魔法
查看>>
Tesseract 3 语言数据的训练方法
查看>>
Oracle Hints具体解释
查看>>
第27周一
查看>>
C primer plus 练习题 第三章
查看>>
memcached Logging
查看>>
Python并发编程实例教程
查看>>
数学图形(1.40)T_parameter
查看>>
js获取Html元素的实际宽度高度
查看>>