【算法?日更?第二十五期】万能算法(一):搜索+?

▎前言

  看到这个标题,你是不是倍感疑惑,为什么会是搜索+,而不是搜索,会不会是小编打错的,其实本篇博客将会让你看到搜索的各种玩法。

▎前置技能

?『基础知识』

  搜索:dfs和bfs(戳这里迅速上手)

?『dfs和bfs的异同点』

  相同点:dfs和bfs都用于搜索,都是来寻找点的。

  不同点:dfs以深度为优先,不撞南墙不回头,一鼓作气搜遍一条路,所以比较不靠谱,但是代码量少,也好写,大部分人都喜欢用。而bfs则是以广度为优先,逐层遍历,相比dfs来说更加理性,但是当状态不好存储时,就只能用dfs了。

▎dfs+bfs:传说中的bdfs

?『迭代加深搜索』

  其实没有bdfs,人家的真名叫迭代加深搜索。

  如果你搜一下百度,那么度娘会告诉你:在计算机科学中,迭代深化搜索(iterative deepening search)或者更确切地说迭代深化深度优先搜索 (iterative deepening depth-first search (IDS or IDDFS)) 是一个状态空间(状态图)搜索策略。在这个搜索策略中,一个具有深度限制的深度优先搜索算法会不断重复地运行,并且同时放宽对于搜索深度的限制,直到找到目标状态。IDDFS 与广度优先算法是等价的,但对内存的使用会少很多;在每一步迭代中,它会按深度优先算法中的顺序,遍历搜索树中的节点,但第一次访问节点的累积顺序实际上是广度优先的。(copy自百度)

  说了半天也什么也不懂,那么就来看一看引例吧。

?『引例』

例 – 埃及分数

  这道题先来想bfs,如何存储状态,这显然是不好存储的。

  用dfs呢?又表示很无力,因为不知道由几个分数组成,也不知道每个分母上限是是多大,dfs可能会一直搜下去,一条路走到黑。

  怎么办呢?两种搜索都遇到了瓶颈,那么我们不妨结合一下两种搜索方式。

?『算法核心』

  我们以dfs为主体,而dfs的缺点是越走越远,那么我们可以注入bfs的特性:逐层展开,我们不妨设置一个变量,用于存储层数,限制好dfs到达这一层就不允许继续搜索了。

  这样不仅思路简单,还结合了两种搜索的方式。

?『算法模板』

  

  (copy自cdcq的ppt)

▎搜索+剪枝

  如果将搜索的各状态间依据转移顺序连接好边,那么就会形成搜索树,而剪枝正是将无用的枝条剪去以增加效率。

  剪枝优化(戳这里迅速上手)

▎搜索+状态压缩

?『状态压缩』

  有时可能一张图不能用二维数组存下,原因是数据规模太大。

  也可能是想优化一下算法的时间复杂度。

  我们就可以用状态压缩,将图转化成二进制,一维数组即可存下整张图,或者使用lowbit也是优化算法的好办法。

?『引例』

  还是N皇后题目及题解(戳这里学习)

?『状态压缩应用』

  状态压缩优化动态规划例题精讲(戳这里学习)

▎搜索+搜索

  没错,这就是双向搜索。

  双向BFS,就是在起点和终点都很清楚的情况下,把起点和终点同时入队,或者进两个队,共同进行bfs,当二者第一次相遇时为最优解。

  目的是为了解决搜索访问状态太多的问题,时间复杂度比单向的搜索优化了不少。

原文地址:https://www.cnblogs.com/TFLS-gzr/p/11248509.html

时间: 2024-08-01 15:57:20

【算法?日更?第二十五期】万能算法(一):搜索+?的相关文章

【算法?日更?第二十六期】非常基础的数论

一说到基础数论,那么我们就从整除那套理论开始谈起. ▎整除 ?『定义』 如果a能把b整除,也就是没有余数,则我们称a整除b,亦称b被a整除,记为a|b. 其中的“|”称为整除符号. ?『性质』 ①自反性:显然,对于任意正整数n,有n|n: ②传递性:若有a|b,b|c,则有a|c: ③反对称性:若a|b,b|a,则有a=b: 其中性质③很有用,通常用于无法直接证明a=b的情况,不过用到的少. ▎约数和倍数 ?『定义』 如果a|b,那么a是b的约数,b是a的倍数,也称a是b的因数/因子. ?『推论

【算法?日更?第二十期】构造分治

▎什么是分治? ?『定义』 分治,字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并.在计算机科学中,分治法就是运用分治思想的一种很重要的算法.分治法是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)等等.(copy自百度) 一句话总结:分治就是把大问题转化成若干小问题,小问题解决后,大问题自然就迎刃而解. ?『使用条件』 ①大问题分解成

SIGAI机器学习第二十五集 聚类算法2

讲授聚类算法的基本概念,算法的分类,层次聚类,K均值算法,EM算法,DBSCAN算法,OPTICS算法,mean shift算法,谱聚类算法,实际应用 课程大纲: 基于密度的聚类算法简介DBSCAN算法的核心思想基本概念定义算法的流程实现细节问题实验OPTICS算法的核心思想基本概念定义算法的流程根据排序结果生成聚类结果实验Mean Shift算法的核心思想核函数概率密度估计算法的流程谱聚类算法的核心思想基本概念定义算法的流程算法评价指标应用聚类算法总结 这节课讲,基于密度的聚类算法:DBSCA

Android Studio第二十五期 - 自定义键盘+支付输入框

代码已经整理好,效果如下图: 地址:https://github.com/geeklx/MyApplication/tree/master/p017_keyboard

分布式技术追踪 2017年第二十五期

分布式系统实践 1. 获得PCC性能大赛背后的RocksDB引擎:5分钟全面了解其原理 http://dwz.cn/68s1H8 摘要: RocksDB是Google LevelDB的优化版本, 由facebook开源, 本文简要介绍了RocksDB的特性. 2. 一篇文章掌握Sql-On-Hadoop核心技术 http://dwz.cn/69U8Gv 摘要: 这篇文章对查询引擎的技术总结的很到位, 推荐对查询引擎感兴趣的同学阅读. 微服务技术 1. 微服务入门指南 http://dwz.cn/

Android第二十五期 - 猜歌小游戏

代码已经整理好了,如下效果图: 地址:http://yunpan.cn/cArkdixh5NbpQ  提取码 9300

经典算法题每日演练——第二十五题 块状链表

原文:经典算法题每日演练--第二十五题 块状链表 在数据结构的世界里,我们会认识各种各样的数据结构,每一种数据结构都能解决相应领域的问题,每一种数据结构都像 是降龙十八掌中的某一掌,掌掌毙命... 当然每个数据结构,有他的优点,必然就有它的缺点,那么如何创造一种数据结构 来将某两种数据结构进行扬长避短,那就非常完美了.这样的数据结构也有很多,比如:双端队列,还有就是今天讲的 块状链表, 我们都知道 数组 具有 O(1)的查询时间,O(N)的删除,O(N)的插入... 链表 具有 O(N)的查询时

平安科技移动开发二队技术周报(第十五期)

平安科技移动开发二队技术周报(第十五期) @author ASCE1885的 Github 简书 微博 CSDN 业界新闻 1)谷歌重组更名Alphabet 谷歌8月11日宣布重组.拉里-佩奇将与谢尔盖-布林创办新的控股公司Alphabet,两人分别出任CEO与总裁职位.Alphabet将取代谷歌在纳斯达克上市,谷歌目前所有股份将自动转换为同等数量与权益的Alphabet股份.原先的谷歌将成为Alphabet的全资子公司. Alphabet公司架构: 2)BlackHat 2015 黑帽大会总结

大白话5分钟带你走进人工智能-第二十五节决策树系列之信息增益和信息增益率(4)

                                                       第二十五节决策树系列之信息增益和信息增益率(4) 上一节我们讲解了决策树的分裂条件以及评估纯度的其中一个方式,基尼系数.本节的话,我们再讲解一个评估纯度的方式,基于信息增益的方式,即ID3树使用的评估方式.它办的事跟Gini系数一样,也是评价纯度,但是它更客观一点,但它算起来比Gini系数稍慢一点,它办的事跟Gini系数一样,也是评价纯度,但是它更客观一点,算起来比Gini系数稍慢一点,