0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

一种优化的方法:记忆化搜索

算法与数据结构 来源:小K算法 作者:小K 2022-06-14 10:21 次阅读
01 故事起源有一天小K去滑雪,雪山高低不平,当然小K只能从高的地方向低的地方滑,那如何选择路线才能滑的最远呢? 把这个问题抽象描述如下:

在一个二维地图中,数值代表此处山的高度,在某个点只能滑向上下左右4个相邻的点,最远的滑行路线,也就等价于找出一条最长的数值下降路线。

比如下图中的红色路线就是此时最长的一条路线,长度为10。那要如何找出这样的一条路线呢?
64a37f7a-eb88-11ec-ba43-dac502259ad0.jpg    02 分析在每个点上,只能向周围4个方向滑行,当然前提是此处的高度必须比周围高。 64b7b616-eb88-11ec-ba43-dac502259ad0.jpg  我们当然可以选择尽可能高的位置出发,比如图中17比15要高。 64ff5ffc-eb88-11ec-ba43-dac502259ad0.jpg  但这种有可能会陷入局部最优解,比如从下图中的15开始,最大长度为2。而从13开始会更优,长度为5。 65127cb8-eb88-11ec-ba43-dac502259ad0.jpg  所以启示我们,不能简单的贪心,而是要考虑全局最优,因为每一个起点都有可能是最优的起点。
那就有了初步的框架了,从每一个起点出发,把可行的路线都找出来,也就是能走的路线都走一遍,再比较全局最优的就行了,而且这也正好符合深搜的算法框架。伪代码

			intfind(inti,intj){  //向4个方向尝试  for(i=0->3){  if(ok){  returnfind(next)+1  } } } intmain(){  for(i=0->n){  for(j=0->m) {  t=find(i,j)  ans=max(ans,t)  }  } }
			
									03
									问题上面的做法可以得到最优解,但有一个问题。如下例,以15为起点的时候,会尝试把6->5->4->3->2->1走一遍。但以16为起点的时候,还会尝试把这条路线走一遍,这就会导致大量的重复计算。
			653bb826-eb88-11ec-ba43-dac502259ad0.jpg
			 那能不能优化呢? 之所以重复计算,是因为每一次尝试都是重新的开始,它并不知道这条路已经走过了,也就是没有记忆,所以我们引入一种优化的方法,就是记忆化搜索。
			
									04
									记忆化搜索可以引入一个f[i][j]数组,记录以(i,j)为起点所能找到的最长路线的长度,初始赋值为-1,表示还没有走过。
			6544aac6-eb88-11ec-ba43-dac502259ad0.jpg
			 当走过一点,就将对应的f[i][j]更新为以(i,j)为起点的最大长度。 再回到上面的问题,因为之前肯定走过了(2,3),对应的f[2][3]为6,当尝试从(2,4)出发时,会发现周围已经走过了,只需要更新当前的值+1即可,就避免了重复计算。
			659bca36-eb88-11ec-ba43-dac502259ad0.jpg
			 
									 05
									代码实现路线搜索

			intfind(vector<vector<int>>&snowMountain,vector<vector<int>>&f,inti,intj,intr,intc){ intx,y; if(f[i][j]!=-1) returnf[i][j]; f[i][j]=1; for(intk=0;k< 4;k++){ x=i+direction[k][0]; y=j+direction[k][1]; //validdirection if(x>=0&&x< r && y >=0&&y< c && snowMountain[i][j] >snowMountain[x][y]){ f[i][j]=maxOfTwo(f[i][j],find(snowMountain,f,x,y,r,c)+1); } } returnf[i][j]; }main函数

			intmain(){ ifstreamfin("a.in"); ofstreamfout("a.out"); inti,j,r,c,maxHeight=0; fin>>r>>c; vector<vector<int>>snowMountain(r,vector<int>(c,0)); vector<vector<int>>f(r,vector<int>(c,-1)); for(i=0;i< r; i++)         for(j=0;j< c; j++)             fin >>snowMountain[i][j]; for(i=0;i< r; i++)         for(j=0;j< c; j++) {             maxHeight = maxOfTwo(maxHeight, find(snowMountain, f, i, j, r, c));         }     fout << maxHeight << endl; fin.close(); fout.close(); return0; }
			
									06
									总结记忆化搜索是一种非常实用的算法,因为深搜用递归很容易实现,记忆化又避免了重复子问题的计算,提高了运行效率。 这其实就是动态规划的思想,常见的动态规划用递推实现,相比记忆化搜索实现上会更难一点,而记忆化搜索就没有这个问题。 算法的适用场景也需要根据具体的问题来分析,一般常用在地图或者树型结构中。
			
			审核编辑 :李倩

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 算法
    +关注

    关注

    23

    文章

    4601

    浏览量

    92703
  • 代码
    +关注

    关注

    30

    文章

    4758

    浏览量

    68392

原文标题:啥是记忆化搜索?

文章出处:【微信号:TheAlgorithm,微信公众号:算法与数据结构】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    一种创新的动态轨迹预测方法

    本文提出了一种动态轨迹预测方法,通过结合历史帧和历史预测结果来提高预测的稳定性和准确性。它引入了历史预测注意力模块,以编码连续预测之间的动态关系,并通过三重因子注意力模块实现了最先进的性能。本方法能够生成准确且稳定的未来轨迹,这
    的头像 发表于 10-28 14:34 310次阅读
    <b class='flag-5'>一种</b>创新的动态轨迹预测<b class='flag-5'>方法</b>

    一种简单高效配置FPGA的方法

    本文描述了一种简单高效配置FPGA的方法,该方法利用微处理器从串行外围接口(SPI)闪存配置FPGA设备。这种方法减少了硬件组件、板空间和成本。
    的头像 发表于 10-24 14:57 407次阅读
    <b class='flag-5'>一种</b>简单高效配置FPGA的<b class='flag-5'>方法</b>

    一种利用wireshark对远程服务器/路由器网络抓包方法

    一种利用wireshark对远程服务器/路由器网络抓包方法
    的头像 发表于 09-21 08:03 2157次阅读
    <b class='flag-5'>一种</b>利用wireshark对远程服务器/路由器网络抓包<b class='flag-5'>方法</b>

    一种无透镜成像的新方法

    使用OAM-HHG EUV光束对高度周期性结构进行成像的EUV聚光显微镜 为了研究微电子或光子元件中的纳米级图案,一种基于无透镜成像的新方法可以实现近乎完美的高分辨率显微镜。 层析成像是一种强大的无
    的头像 发表于 07-19 06:20 339次阅读
    <b class='flag-5'>一种</b>无透镜成像的新<b class='flag-5'>方法</b>

    rup是一种什么模型

    部分)开发的,它基于统建模语言(UML)和面向对象的软件开发方法。RUP提供了一种结构方法来开发软件,它包括
    的头像 发表于 07-09 10:13 1178次阅读

    机械自动是自动一种

    引言 自动技术是指利用控制装置对生产过程进行控制,以实现生产过程的自动。机械自动是自动技术的一种,它主要涉及到使用机械设备和控制系统
    的头像 发表于 07-01 09:32 1571次阅读

    一种利用光致Lamb波对微米级颗粒进行大通量操控的光声图案方法

    近日,北京理工大学李锋教授联合华南理工大学李志远教授与中央民族大学郭红莲教授提出了一种利用光致Lamb波在空气中对微米级颗粒进行大通量操控的光声图案方法
    的头像 发表于 04-25 09:14 698次阅读
    <b class='flag-5'>一种</b>利用光致Lamb波对微米级颗粒进行大通量操控的光声图案<b class='flag-5'>化</b><b class='flag-5'>方法</b>

    什么电路具有记忆功能 时序电路是不含有记忆功能的器件对吗

    触发器等特定的电路元件来实现记忆功能。以下会详细介绍几种具有记忆功能的电路。 1. 存储器:存储器是一种具有记忆功能的电路元件,用于存储和检索数据。存储器可以分为随机存取存储器(RAM
    的头像 发表于 03-26 16:12 2389次阅读

    谷歌搜索引擎优化的各个方面和步骤

    谷歌搜索引擎是最受欢迎和广泛使用的搜索引擎之,为了使你的网站在谷歌上更好地排名并提高曝光度,你可以采取些谷歌搜索引擎
    的头像 发表于 01-25 10:29 842次阅读

    一种简单易行的可编程振荡器构建方法

    本文介绍一种简单易行的可编程振荡器构建方法,其中振荡频率和幅度可以通过使用digiPOT来彼此独立地调节。
    发表于 01-15 10:05 227次阅读
    <b class='flag-5'>一种</b>简单易行的可编程振荡器构建<b class='flag-5'>方法</b>

    一种锂电池内水去除工艺方法

    一种锂电池内水去除工艺方法
    的头像 发表于 01-04 10:23 465次阅读
    <b class='flag-5'>一种</b>锂电池内水去除工艺<b class='flag-5'>方法</b>

    一种八腔带通腔体滤波器的设计方法

    摘 要: 介绍了一种八腔带通腔体滤波器的设计方法。结合仿真软件SuperFilter与Ansoft HFSS的三维场仿真,能极大减少设计微波腔体滤波器的时间和成本。通过对模型的仿真和优化,最终设计出来的滤波器实验测试结果与仿真结
    的头像 发表于 12-16 16:51 1798次阅读
    <b class='flag-5'>一种</b>八腔带通腔体滤波器的设计<b class='flag-5'>方法</b>

    一种产生激光脉冲新方法

    等离子体中脉冲压缩的概念 英国和韩国的科学家提出了一种产生激光脉冲的新方法,其功率是现有激光脉冲的1000多倍。 科学家们使用计算机模拟联合研究,展示了一种压缩光的新方法,以充分提高光
    的头像 发表于 12-07 06:32 475次阅读
    <b class='flag-5'>一种</b>产生激光脉冲新<b class='flag-5'>方法</b>

    一种大功率PCB散热管理的方法

    一种大功率PCB散热管理的方法
    的头像 发表于 12-05 14:28 585次阅读
    <b class='flag-5'>一种</b>大功率PCB散热管理的<b class='flag-5'>方法</b>

    一种涡扇发动机转子转速信号及高齿信号测量方法

    航空发动机工作状态的变化多数情况都伴随着发动机转速的变化,转速直接与经过发动机的流量及推力联系在起,因此转速信号的采集显得十分重要。鉴于此,提出了一种高可靠转速信号及高齿信号采集的方法,使用信号
    的头像 发表于 12-04 14:10 713次阅读
    <b class='flag-5'>一种</b>涡扇发动机转子转速信号及高齿信号测量<b class='flag-5'>方法</b>