您的位置:首页 > 其它

DFS BFS 搜索总结

2017-07-21 08:34 309 查看
做了好多天的搜索,今天来总结下。

DFS 与 BFS

DFS:深度优先搜索:利用栈这种数据结构来实现(利用递归便于实现,但是效率较低),找到的第一个解不一定是最优解,只是先序遍历最早的可行解。

BFS:广度优先搜索:利用队列这种数据结构来实现,找到的第一个解经常都是最优解(如迷宫的最短路径),但是不常用来求所有解(重复的次优解常常都被剪枝剪掉了)。

void DFS(int y)//DFS第y行
{
if(y==n)
cnt++;
for(int i=0;i<n;i++)
if(ok(y,i)){  //判断是否越界也可以加入剪枝条件
map[y][i]=1; //放在这
DFS(y+1);
map[y][i]=0; //不放这

}

void BFS ()
{
queue Q;
Q.push(startState);//初始状态的压入

while(!Q.empty)  //队列不为空
{
curState=Q.front();  //取队头

if(curState == endState)  //判断是否达到终止条件
return true;

exState=extend(curState);//利用方向数组得到扩展状态
if(!mark[exState])     // 判重与剪枝
{
Q.push(exState);  //将扩展状态压入
mark[curState]=true;//标记
}
}
}


BFS的算法时间复杂度要比DFS小,而且BFS是寻找到目标状态就完成,而DFS是一直寻找到目标状态的所有方法,所以二者各有应用。

同学告诉我:BFS比较稳健,DFS在“迷宫”种一直找来找去,很容易造成死循环,而且需要剪枝

例:跳马问题问是否可以从起始点到结束点  BFS的算法较快

       http://blog.csdn.net/deepseazbw/article/details/75504277

    单个的从起始状态到目标状态  BFS

      http://blog.csdn.net/deepseazbw/article/details/75270182

     但是涉及到了搜索到的个数问题这时候用 DFS

      http://blog.csdn.net/deepseazbw/article/details/75453355

   多个从起始状态到目标状态是否完成  DFS

      http://blog.csdn.net/deepseazbw/article/details/75581424

      http://blog.csdn.net/deepseazbw/article/details/75453339

涉及到搜索问题很多将会采用方向数组,数组的定义根据棋盘问题的不同裁定,

1. 正常的上下左右移动

2.跳马的8个方向移动 

3.连通部分的8个方向移动
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: