dfs:
dfs算法是一个对连通图进行遍历的算法。它的思想是从一个被选定的点出发一条路走到底,如果得不到目的解,那就返回到上一个节点,然后换一条路继续走到底,直到找到目的解返回或者全部遍历完返回一个事先定好的值。dfs一般借用递归完成整个算法的构造。
dfs算法的一般框架经我总结大致为下:
int dfs()
{
If(达到目的)处理return;
else
{
处理;
dfs();
}
}
1
2
3
4
5
6
7
8
9
bfs:
bfs算法是也一个对连通图进行遍历的算法。它的思想是从一个被选定的点出发;然后从这个点的所有方向每次只走一步的走的到底(即其中一个方向走完一步之后换下一个方向继续走);就像池塘中被扔进一颗石子随后向四周荡起的波纹。如果得不到目的解,那就返回事先定好的值,如果找到直接返回目的解。与dfs不同的是,bfs不是运用的递归,而是运用队列和函数内循环构造的。
bfs算法的一般构架经我总结大致如下:
void bfs()
{
queue<数据类型>q;
q.push(数据变量);
while(!q.empty())
{
数据类型 t;
t=q.front();
q.pop();
(根据题意可做变形处理);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
总的来说,dfs和bfs大都运用在图的处理上:如迷宫,八皇后,n皇后,油田,连通块,数独等,在这些类型的题上几乎全需要dfs或bfs来解,或者说有些难度更大的需要bfs+dfs或bfs+bfs才能完成。
对比dfs和bfs:
当遇到一些层次较深的树图时,dfs一读到底的风格就不太适合一些限制时间的题,因为针对这些内存巨大的,使用dfs就会比较耗时,比方说一个数有1000个树枝,每个树枝有100个子叶,第1000的第一颗叶子就是正解,但是在遍历的时候却选择从第一个树枝开始遍历且一读到底,遍历到正解得时候已经做了999*100次遍历了,这时只要把dfs换成bfs,就会节约许多时间,只需要1000次的遍历就可以找到答案,所以由上可得,在一些大的内存或者层次比较的大树,应选择使用bfs来解决;反之,则使用dfs。c
还有一些根据题意就可以看出来是选择dfs还是bfs;比如题中需要的目的解是需要判断从最初的状态能否得到,这个时候就应该选择dfs了。像一些需要一步一步的完成就要选择bfs。
作者:王道之
来源:CSDN
原文:
https://blog.csdn.net/wanglin007/article/details/82054813
版权声明:本文为博主原创文章,转载请附上博文链接!