图的搜索算法小结

1.深度优先搜索与广度优先搜索算法有何区别

通常深度优先搜索法不全部保留结点,扩展完的结点从数据存储结构栈中弹出删去,这样,一般在数据栈中存储的结点数就是解空间树的深度,因此它占用空间较少。所以,当搜索树的结点较多,用其它方法易产生内存溢出时,深度优先搜索不失为一种有效的求解方法。
  广度优先搜索算法,一般需存储产生的所有结点,占用的存储空间要比深度优先搜索大得多,因此,程序设计中,必须考虑溢出和节省内存空间的问题。但广度优先搜索法一般无回溯操作,即入栈和出栈的操作,所以运行速度比深度优先搜索要快些。

2.回溯与分支限界法

回溯法以深度优先的方式搜索解空间树T,而分支限界法则以广度优先或以最小耗费优先的方式搜索解空间树T。由于它们在问题的解空间树T上搜索的方法不同,适合解决的问题也就不同。一般情况下,回溯法的求解目标是找出T中满足约束条件的所有解的方案,而分支限界法的求解目标则是找出满足约束条件的一个解,或是在满足约束条件的解中找出使用某一目标函数值达到极大或极小的解,即在某种意义下的最优解。相对而言,分支限界算法的解空间比回溯法大得多, 因此当内存容量有限时,回溯法成功的可能性更大。

下表列出了回溯法和分支限界法的一些区别:

  在处理最优问题时,采用穷举法、回溯法或分支限界法都可以通过利用当前最优解和上界函数加速。仅就对限界剪支的效率而言,优先队列的分支限界法显然要更充分一些。在穷举法中通过上界函数与当前情况下函数值的比较可以直接略过不合要求的情况而省去了更进一步的枚举和判断;回溯法则因为层次的划分,可以在上界函数值小于当前最优解时,剪去以该结点为根的子树,也就是节省了搜索范围;分支限界法在这方面除了可以做到回溯法能做到的之外,同时若采用优先队列的分支限界法,用上界函数作为活结点的优先级,一旦有叶结点成为当前扩展结点,就意味着该叶结点所对应的解即为最优解,可以立即终止其余的过程。在前面的例题中曾说明,优先队列的分支限界法更象是有选择、有目的地进行深度优先搜索,时间效率、空间效率都是比较高的。

3.动态规划与搜索算法

撇开时空效率的因素不谈,在解决最优化问题的算法中,搜索可以说是“万能”的。所以动态规划可以解决的问题,搜索也一定可以解决。动态规划要求阶段决策具有无后向性,而搜索算法没有此限止。

动态规划是自底向上的递推求解,而无论深度优先搜索或广度优先搜索都是自顶向下求解。利用动态规划法进行算法设计时,设计者在进行算法设计前已经用大脑自己构造好了问题的解空间,因此可以自底向上的递推求解;而搜索算法是在搜索过程中根据一定规则自动构造,并搜索解空间树的。由于在很多情况下,问题的解空间太复杂用大脑构造有一定困难,仍然需要采用搜索算法。

另外动态规划在递推求解过程中,需要用数组存储有关信息,而数组的下标只能是整数,所以要求问题中相关的数据必须为整数(如4.5.3节【例2】“资源分配问题”中的资金就必须为整数),对于这类信息非整数或不便于转换为整数的问题,同样需要采用搜索算法。

一般说来,动态规划算法在时间效率上的优势是搜索无法比拟的,但动态规划总要遍历所有的状态,而搜索可以排除一些无效状态。更重要的是搜索还可以剪枝,可能剪去大量不必要的状态,因此在空间开销上往往比动态规划要低很多。如何协调好动态规划的高效率与高消费之间的矛盾呢?有一种折衷的办法就是记忆化搜索算法

记忆化限界搜索算法在求解时,还是按着自顶向下的顺序,但是每求解一个状态,就将它的解保存下来,以后再次遇到这个状态的时候,就不必重新求解了。这种方法综合了搜索和动态规划两方面的优点,因而还是很有实用价值的。记忆化限界搜索。它以搜索算法为核心,只不过使用“记录求过的状态”的办法,来避免重复搜索,这样,记忆化搜索的每一步,也可以对应到动态规划算法中去。记忆化搜索有优化方便、调试容易、思维直观的优点,但是效率上比循环的动态规划差一个常数,但是时间和空间复杂度是同一数量级的(尽管空间上也差一个常数,那就是堆栈空间)。当n比较小的时候,我们可以忽略这个常数,从而记忆化搜索可以和动态规划达到完全相同的效果。

转载于:https://www.cnblogs.com/gd-luojialin/p/10384924.html

19图的搜索算法总结与比较相关推荐

  1. 回溯法采用的搜索策略_17图的搜索算法之回溯法

    回 溯 法 回溯算法实际是一个类似枚举的搜索尝试方法,它的主题思想是在搜索尝试中找问题的解,当不满足求解条件就"回溯"返回,尝试别的路径.回溯算法是尝试搜索算法中最为基本的一种算法 ...

  2. 数据结构与算法之-----图(搜索算法)

    [ 写在前面的话:本专栏的主要内容:数据结构与算法. 1.对于​​​​​​​初识数据结构的小伙伴们,鉴于后面的数据结构的构建会使用到专栏前面的内容,包括具体数据结构的应用,所使用到的数据结构,也是自己 ...

  3. 图 深度优先搜索算法

    //编程建立有向图的邻接矩阵存储结构,实现图的深度优先搜索算法.  //(1)采用邻接矩阵存储结构创建一个有向图. //(2)图的深度优先搜索算法的实现. // //输入以下测试数据: //测试数据: ...

  4. redis灵魂拷问:19图+11题带你面试通关

    又到了金三银四跳槽季,好多同学已经开始行动了.今天我来助力一把,送出这套redis面试题,助力大家通关. 1 redis为什么响应快 1.1数据保存在内存中 redis数据保存在内存中,读写操作只要访 ...

  5. 图的搜索算法 BFS

    最近在牛客做了几道BFS的题目,应该是重回经典了,相比之前,也有了一些不一样的感悟,现在写下来记下以往的思考经历. 题目的意思是一个人带着鱼可以走r1步数,猫可以闻r2的步数,现在把他们放在一张图下面 ...

  6. 为什么要进行图学习?谈一谈逆势而上的图神经网络

    点击上方 蓝字关注我们 问一问近几年来逆势而上的技术有什么?相信你一定会说出来一个:图神经网络. 图神经网络将会在人工智能的各个领域起着非常重要的作用,虽然目前还没有完全成为各大顶会的焦点,但不可否认 ...

  7. 算法导论——lec 10 图的基本算法及应用

    搜索一个图是有序地沿着图的边訪问全部定点, 图的搜索算法能够使我们发现非常多图的结构信息, 图的搜索技术是图算法邻域的核心. 一. 图的两种计算机表示 1. 邻接表: 这样的方法表示稀疏图比較简洁紧凑 ...

  8. KDD 2021 | 异质图神经网络的可微元图搜索

    论文标题: DiffMG: Differentiable Meta Graph Search for Heterogeneous Graph Neural Networks 论文地址: https:/ ...

  9. 6.1 图的深度优先和广度优先搜索

    图的广度优先搜索 图的的搜索算法主要分为广度优先搜索(breadth-first search或BFS)和深度优先搜索(depth-first search或DFS).首先讨论广度优先搜索算法. 称之 ...

最新文章

  1. python wsdl connection refused 111
  2. 超级的全中文语音数据集合
  3. java动态代理(JDK和cglib)详解
  4. hdu 4667 Building Fence 计算几何模板
  5. zblog php 当前位置,zblogphp导航当前页突出显示的方法
  6. 方钢管弹性模量计算方式_弹性模量的物理学本质
  7. idea如何安装scala插件
  8. Spring学习总结(11)——Spring JMS MessageConverter介绍
  9. 汇编语言伪指令详解(附实例)
  10. 书评:我看《软件开发沉思录ThoughtWorks文集》
  11. 一个画布有多个子图_如何把多张图拼成一张长图
  12. Qt中出现0xc0000135错误
  13. 西安游记(钟楼 -- 回民街 -- 西安古城墙)
  14. Codeforces 1156B
  15. 车载BlueTooth通话机制原理及开发
  16. 安格鲁貂出现感冒如何解决?
  17. 降噪耳机推荐,四款优秀的降噪耳机分享
  18. JDK14打包工具jpackage的使用
  19. 【无监督】自编码器(Autoencoder)
  20. Pytest-Pytest框架的使用

热门文章

  1. EJB的分类及其各自的功能和应用
  2. Linux-Bind-DNS服务器配置实例
  3. Android ActionBar完全解析,使用官方推荐的最佳导航栏(上)
  4. 腾讯面试:bitmap统计元素出现次数,使用较少内存
  5. 一个小程序看流的读取
  6. 树莓派上搭建Git服务器
  7. 数据结构: 插值查找算法
  8. 前端一HTML:二十四伪类
  9. mybaits二十六:mybatis,spring整合
  10. McAfee ENS