搜索算法总结
概述
搜索算法
搜索算法大致可以分为以下几类:
- DFS 深度优先搜索
- BFS 广度优先搜索
- 迭代加深搜索
- A*搜索
- IDA* 启发式迭代加深搜索
- meet in the middle 折半搜索
- 双向 DFS
- 双向 BFS
- 0/1 BFS 双端队列广搜
- Dancing Links 舞蹈链
Dancing Links 算法是省选内容,在此不进行说明。
剪枝技巧
剪枝是搜索题常用的优化方式,有时能大幅提升程序运行效率,常见剪枝技巧如下:
- 可行性剪枝
- 最优性剪枝
- 排序剪枝(优化搜索顺序)
- 搜索位置剪枝(记录上一层搜索到的位置,下一层接着搜,不重新来)
- 逆向操作剪枝(两个相反的操作避免重复做)
- 重复剪枝(vis数组)
- 层数剪枝(必须证明到某一层时一定不优)
- 枚举剪枝(只利用上一层新加的数来和前面的数组合,避免重复搜上一层搜过的)
以下是常见的玄学剪枝技巧,考场上用来搏更高分的,按数据大小分段来解决,不保证正确性:
- 搜索次数剪枝(cnt>1e7,cout<<ans),本质是最优性剪枝
注意事项
注意事项:
- 迭代加深等搜索算法不见得总是比普通的 DFS 和 BFS 快,还是要根据具体情形判断。
- 搜索题的常数必须小到极致,可以使用 unordered_map 或二分等思路优化。
卡常技巧
- 使用 unordered_map 代替 map
- 使用二分代替线性扫描
- 把 sort 换为 stable_sort
- 使用位运算代替普通数组
- 引入估价函数
- 转变搜索顺序(尤其是在一个点上被卡)
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战