宽度优先搜索与深度优先搜索

来源:互联网 发布:c语言取反加一 编辑:程序博客网 时间:2024/05/20 02:30


宽度优先搜索算法顺序:1-2-3-4-5-6-7

深度优先搜索算法顺序:1-2-4-5-3-6-7

宽度优先搜索算法(又称广度优先搜索)BFS,属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止。Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想。


structNode{intx;inty;intstep;Node(intx1,inty1,intstep1):x(x1),y(y1),step(step1){}};intBFS(){Nodenode(0,0,0);queue<Node>q;while(!q.empty())q.pop();q.push(node);while(!q.empty()){node=q.front();q.pop();if(node.x==n-1&&node.y==n-1){returnnode.step;}visit[node.x][node.y]=1;for(inti=0;i<4;i++){intx=node.x+stepArr[i][0];inty=node.y+stepArr[i][1];if(x>=0&&y>=0&&x<n&&y<n&&visit[x][y]==0&&mazeArr[x][y]==0){visit[x][y]=1;Nodenext(x,y,node.step+1);q.push(next);}}}return-1;}

与深度优先搜索的对比

深度优先搜索用栈(stack)来实现,整个过程可以想象成一个倒立的树形:
1、把根节点压入栈中。
2、每次从栈中弹出一个元素,搜索所有在它下一级的元素,把这些元素压入栈中。并把这个元素记为它下一级元素的前驱。
3、找到所要找的元素时结束程序。
4、如果遍历整个树还没有找到,结束程序。
广度优先搜索使用队列(queue)来实现,整个过程也可以看做一个倒立的树形:
1、把根节点放到队列的末尾。
2、每次从队列的头部取出一个元素,查看这个元素所有的下一级元素,把它们放到队列的末尾。并把这个元素记为它下一级元素的前驱。
3、找到所要找的元素时结束程序。
4、如果遍历整个树还没有找到,结束程序。
深度优先搜索算法(Depth-First-Search),是沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所有边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。属于盲目搜索。利用深度优先搜索算法可以产生目标图的相应拓扑排序表,利用拓扑排序表可以方便的解决很多相关的图论问题,如最大路径问题等等。


0 0