关于搜索。
这几天着重练习了搜索。从深度/广度搜索到回溯。虽然感觉对处理该类型里中等难度题依然有些力不从心,但好歹有了想法与大体框架。下面就按层次分别总结下搜索。
深搜:(dfs)
主要思想:“一条路走到黑”,按搜索的思想出发找到扩展点便一直扩展下去。
主要注意对搜过点的标记以及剪枝。
然后没啥了。
宽搜:(bfs)
主要思想:利用队列,不但保证了在求解问题搜索过程中的层次性,同时因为搜索过点需要进一次队列的原因省掉了判重的过程。适合求解需要最小拓展类问题
但一定要注意剪枝,因为将每层都完全拓展开来,这个树会非常庞大。
回溯:*重点*
主要思想:在处理某类拓展方式相同的问题时,可采用类似dfs的方法,对每一次拓展出来的点做相同操作向下拓展,并在当发现该拓展点无法求得最终解后返回上层的拓展点按下种方式拓展。
回溯一般步骤(官方版)
- 定义一个解空间,它包含问题的解;(建立回溯模型)
- 用适于搜索的方式组织该空间;(定义回溯“增量数组”)
- 用深度优先法搜索该空间,利用限界函数避免移动到不可能产生解的子空间。直到找到问题的解(加边界控制范围,还可以再加上特判用来剪枝)
注意:如果不回溯,效率会很高,但是不能把所有的方案都搜索出来,如果回溯,效率会很低。时间复杂度能达到阶乘级别。
1)递归参数
2)边界
3) 搜索范围
4)状态修改和回溯。