搜索 学习笔记
目录
-
最基础的搜索
1.1 bfs
1.2 dfs
-
双向搜索
2.1 双向广搜
2.2 双向宽搜
2.3 meet in the middle
3 搜索的优化
3.1 记忆化搜索
3.2 最优性剪枝
3.3 可行性剪枝
3.4 其他方法
-
迭代加深搜索
-
Dancing Links
-
剪枝 -
A/IDA
正文
1. 最基础的搜索
bfs/dfs 无需多言。bfs 瓶颈在于空间,dfs 瓶颈在于递归的时间。
2. 双向搜索
2.1 双向广搜/2.2 双向宽搜
从起点或终点同时进行搜索。
对于广搜,具体地说,给每个点带上从起点/终点转移而来的标记,同时丢进队列里面即可。
对于深搜,感觉好像没啥用。
2.3 meet in the middle
通常发现一个复杂度刚好是
例题1:
先做一半然后丢进 map
,然后在做后一半的时候对前一半的方案进行计数。复杂度
例题2:
一个
显然先从左上搜到
3. 搜索的优化
3.1 记忆化搜索
具体的,如果函数为 dfs(i,j,k)
,那么可以设
3.2 最优性剪枝
如果当前答案加上剩余的最优解(不考虑合法情况)都小于当前的最优解,则不继续搜索。
3.3 可行性剪枝
如果已经不合法,不进行搜索。
3.4 其他方法
调整法/讨论极端情况/数学方法。或许可以考虑改变搜索的状态。
4. 迭代加深搜索
限制迭代层数。但可能搜不出最优解。
5. Dancing Links
咕。
6. 剪枝
咕。在 ACM 中感觉很常见啊。
7. A*/IDA*
引自 oi-wiki
。
定义起点 s,终点 t,从起点(初始状态)开始的距离函数
A* 算法每次从优先队列中取出一个 f 最小的元素,然后更新相邻的状态。
如果
上述条件下,如果 h 满足三角形不等式,则 A* 算法不会将重复结点加入队列。
`IDA* 即为采用迭代加深的 A* 算法。
本文作者:lgh-blog
本文链接:https://www.cnblogs.com/lgh-blog/p/18042784
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步