搜索算法总结

概述

搜索算法

搜索算法大致可以分为以下几类:

  • 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
  • 使用位运算代替普通数组
  • 引入估价函数
  • 转变搜索顺序(尤其是在一个点上被卡)

算法详解

DFS 深度优先搜索

BFS 广度优先搜索

迭代加深搜索

A*搜索

IDA* 启发式迭代加深搜索

meet in the middle 折半搜索

双向 DFS

双向 BFS

0/1 BFS 双端队列广搜

posted @ 2024-06-08 17:53  KS_Fszha  阅读(14)  评论(0编辑  收藏  举报