搜索

•深度优先搜索(DFS)
•广度优先搜索(BFS)
•迭代加深搜索(IDDFS)
•剪枝
•记忆化搜索
 
•1.状态:
•对搜索情况的描述就叫做状态
•比如你遍历一个树,你可以把遍历到的节点作为状态,也可以把遍历过的节点作为状态
(搜索要确定好状态)
•2.搜索树:
•不同的状态之间能够相互转移,即我可以从一个状态变化成另一个状态
•例如把一个序列作为状态,当你对这个序列进行操作后,你能得到另一个序列,表示你移动到了另一个状态
•不同状态之间的转移关系组成了一个树结构(虽然有时候也可能是图结构)
•因此状态也常常被称为节点
3.剪枝
•可行性剪枝:对于绝对到不了目标状态的状态直接cut
•最优化剪枝:对于绝对成不了最终答案的状态直接cut
•剪枝类别很少,具体的应用是丰富多样的
•考虑剪枝的时候,可以直接从最优和可行两个角度考虑
•考虑什么状态一定到不了目标
•考虑什么状态一定不会成为最优值
•思考剪枝的一个重要思路是在极端情况下能不能满足题目要求
 
 
•剪枝的时候也必须保证正确性,如果搜不到正确答案跑得飞快也没有意义
•但是大部分情况请尽可能把你能想到的(保证正确的)剪枝丢上去
 
 可通过更改枚举顺序使方案最优
 
4.记忆化搜索
•刚才我们记录d[i][j]的过程实际上就是一个记忆化搜索的过程
•所谓记忆化搜索,就是记录状态的某些属性(比如从起始状态到此状态的最优花费)
•储存这些属性可能会让之后的搜索更方便,或者更快
•记忆化搜索最常见的应用有两个
•一个是储存最优值进行剪枝
•另一个某些属性需要遍历状态的后续状态才能得到,储存这些属性就可以防止重复遍历
 5.迭代加深搜索
•有时候某个问题状态没法存,深度又不知道有多深,dfs和bfs都遇到了自己的难处
•这个时候迭代加深ID(Iterative Deepen)应运而生,结合了二者的优点
•首先它是逐层搜索,保证第一次达到目标就是最优解,避免了更深层的深入
•有时候状态数随层数深入程指数爆炸趋势,上下两层之间状态数差距非常大
•其次它的遍历方式仍然是dfs,这样方便回溯,不用储存状态
 
原文地址:https://www.cnblogs.com/zyfltyyz/p/11719257.html