dfs和bfs的总结

版权声明:请联系[email protected] https://blog.csdn.net/wanglin007/article/details/82054813

dfs:
dfs算法是一个对连通图进行遍历的算法。它的思想是从一个被选定的点出发一条路走到底,如果得不到目的解,那就返回到上一个节点,然后换一条路继续走到底,直到找到目的解返回或者全部遍历完返回一个事先定好的值。dfs一般借用递归完成整个算法的构造。
dfs算法的一般框架经我总结大致为下:

int dfs()
{
    If(达到目的)处理return;
    else
    {
        处理;
        dfs();
    }
}

bfs:
bfs算法是也一个对连通图进行遍历的算法。它的思想是从一个被选定的点出发;然后从这个点的所有方向每次只走一步的走的到底(即其中一个方向走完一步之后换下一个方向继续走);就像池塘中被扔进一颗石子随后向四周荡起的波纹。如果得不到目的解,那就返回事先定好的值,如果找到直接返回目的解。与dfs不同的是,bfs不是运用的递归,而是运用队列和函数内循环构造的。
bfs算法的一般构架经我总结大致如下:

void bfs()
{
    queue<数据类型>q;
    q.push(数据变量);
    while(!q.empty())
    {
        数据类型 t;
        t=q.front();
        q.pop();
        (根据题意可做变形处理);
    }
}

总的来说,dfs和bfs大都运用在图的处理上:如迷宫,八皇后,n皇后,油田,连通块,数独等,在这些类型的题上几乎全需要dfs或bfs来解,或者说有些难度更大的需要bfs+dfs或bfs+bfs才能完成。
对比dfs和bfs:

  1. 当遇到一些层次较深的树图时,dfs一读到底的风格就不太适合一些限制时间的题,因为针对这些内存巨大的,使用dfs就会比较耗时,比方说一个数有1000个树枝,每个树枝有100个子叶,第1000的第一颗叶子就是正解,但是在遍历的时候却选择从第一个树枝开始遍历且一读到底,遍历到正解得时候已经做了999*100次遍历了,这时只要把dfs换成bfs,就会节约许多时间,只需要1000次的遍历就可以找到答案,所以由上可得,在一些大的内存或者层次比较的大树,应选择使用bfs来解决;反之,则使用dfs。c
  2. 还有一些根据题意就可以看出来是选择dfs还是bfs;比如题中需要的目的解是需要判断从最初的状态能否得到,这个时候就应该选择dfs了。像一些需要一步一步的完成就要选择bfs。

猜你喜欢

转载自blog.csdn.net/wanglin007/article/details/82054813