总结与归纳之搜索
前言
暴力的升级即使搜索,一个完美的搜索算法是有资格碾压标算的。在一次吃瓜中(不要在意内容),一位退役了的国集竟然用
正文
PART1:深度优先搜索算法
俗称
PART2:舞蹈链
引入基本的精确覆盖问题离散化版:给定一个01矩阵,你可以选择一些行,使得最终每列都恰好有一个1。算法自然是
PART3:剪枝技巧
搜索顺序优化:不同的搜索顺序有时候会造成不同规模的搜索树,规模越小越好。
排除等效冗余:面对等价的搜索子树,只要搜一边就好了。
可行性剪枝:对于可以迅速预见结果的状态,如果不可行,立马回溯。
最优性剪枝:面对最优问题,把当前状态,和以搜到的最优解比较,如过之后不可能更优,回溯。
记忆化:如果搜索的状态空间不是树形的,那么可以采用记忆化,这种题目有可能以
PART4:迭代加深
对于搜索树规模极大(甚至无穷),那么可能会在某个子树上浪费太多的时间,这类题目可以采用迭代加深,不停地限制深度,就是按层扩展,疑似
PART5:广度优先搜索
俗称
PART6:广搜与队列变形
这个貌似很少用到(其实最短路基本就是这个的体现,所以这原则上是个最短路)。因此不做过多赘述。如果发现扩展代价不全为1,那么对于 0/1 图可以使用双端队列维护,更一般的在复杂度优秀的前提下用优先队列即可。
PART7:双向搜索
这个是骗分好手,相当于做两次搜索,每次搜一半(有些玄学题不一定要一半)。然后找相遇点,基本上只要正确性没问题,所有搜索都能这么做(时间复杂度也要过关)。
PART8:A*
这个本质就是做一个最好的打算,如果当前状态即使最好,也不符合某种条件,那么剪枝。不过也要用用优先队列维护,所以看复杂度。
PART9:IDA*
相比于 A* 大法。IDA* 更好用,首先他是用迭代加深搜索+A* 实现的算法,代码编起来也很容易。不过对于估价函数的设置,就得思考再三了。
总结
一般不考搜索,因为太无脑了,这种东西在图论上稍微可能会考一些,毕竟现在的竞赛更偏向于思维类的,而不是暴力,不过拿来骗分挺好的,比如双向搜索,在某些时候可以骗到很多的分(本人最高记录骗到状态压缩DP优化80分,纯搜索只有10分)。所以还是要搞好搜索呀。
本文作者:2021hych
本文链接:https://www.cnblogs.com/2021hych/p/16542029.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步