搜索是解决算法问题的一个常用策略,有很多耳熟能详的搜索策略:例如深度优先搜索、广度优先搜索、Best-First搜索等等。对于这些搜索策略我总结了一个通用模板,只需要做出简要修改就可以实现上述三种搜索算法。可能代码行数不如递归法精简,但是这个模板简单无脑用起来还是很顺手的。
模板的伪码如下:
Collection s; //初始化一个集合s
while(s is not empty){ //循环条件s不为空
t=s.pop() //取出集合中的一个元素t
if(t is target){
do something; //t是目标值就进行相应处理
}
for i in t.next(){ //对t进行拓展
if(i is valid){
s.push(i); //如果i是符合要求的就把i加入集合s(可以用来剪枝)
}
}
}
深度优先算法、广度优先算法和Best-First搜索算法都可以使用这一个模板,区别仅仅是使用哪种数据结构作为集合s。对于深度优先搜索,我们使用栈来作为集合s。对于广度优先搜索,我们使用队列作为集合s。对于Best-First搜索,我们使用堆作为集合s。