搜索的一点总结

bfs搜索模型.

  • 最常见的模型:flood fill. 一般用于计算连通块.需要标记哪些点走过,所以dfs求flood fill时不需要恢复现场.
  • bfs通常应用:最短路     根据bfs的特性第一次走到该点就是最短距离.
  • 多源bfs.多个起点,求到达其他点的最短距离.思想是建立超级源点.求超级源点到其他点的距离. 实际操作是将多个起点直接纳入队列.
  • 最小步数模型(从a状态走到b状态最少需要几步)  :状态是指数级别上升,很容易TLE或MLE.因此多用双向广搜优化.
  • 01距离模型.距离有两种类型,多用双端队列bfs求解.
  • A*算法: 普通的bfs当状态数很多的时候存在MLE的风险....A*算法适用于避免MLE的情况.(状态数不多的时候不适用)
/
*A*算法:
1.将bfs的队列换成优先队列,以当前距离+预估距离进行排序.
2.每次出队的都是最小距离.
3.当到达目标状态 return
4.预估距离<=真实值
*
/

 

dfs搜索模型:

  • flood fill 与bfs都可解,但dfs容易爆栈.最好还是用bfs
  • 剪枝: dfs搜索很容易爆栈,这时就需要剪枝
1.搜索顺序剪枝
(先搜某些分支少的结点,可以提高搜索速度)
2.排除冗余
多用于组合型枚举,比如 1 44 1是相同的情况.
3.可行性剪枝
当搜索到某个答案后,可以判断此答案取最好情况也不可能,那么就剪枝
4.最优性剪枝
某答案取最优情况也不可能比当前最好的结果好,那么return
5.记忆化搜索
较少用.
  • 迭代加深: 适用于搜索层数很深但答案层数较浅的情况.大部分需要配合剪枝食用
  • 双向DFS:与双向bfs差不多.可以用来搜索半部分,另一部分搜索可以用已搜索部分打表
  • IDA* : DFS的A*算法.形参大多为到达当前状态的步数.step+预估函数步数>迭代加深枚举步数 return

 

posted @ 2021-04-11 09:22  acmloser  阅读(83)  评论(0编辑  收藏  举报