DFS BFS 搜索总结

来源:互联网 发布:闹钟软件哪个好 编辑:程序博客网 时间:2024/05/22 01:38

做了好多天的搜索,今天来总结下。

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个方向移动


原创粉丝点击