DFS和BFS的区别
- BFS是围绕某个点一层一层的进行遍历,借助队列的数据结构实现。
- DFS是从一个点出发一直往深处遍历,条件不符就折返,通过栈的数据结构实现。
在正常情况下二者的时间复杂度都是相同的O(v+e),但是在内存的使用上BFS由于要使用队列存储所有的外层节点,所以内存消耗相对较大。
从宏观上来看:
- 如果你已经知道解离根节点比较近,那么BFS更好
- 如果整体上每个节点的边很多,那么BFS消耗的内存会很大
- 如果一棵树很深而解很少,那么DFS可能会很慢(相反如果解很多并且都比较深的话,那么BFS就会很慢)从名字上就很容易得出,
- 如果一个问题深度无穷而广度有限,那么DFS就没法获得解,但BFS可以,反之也同理。
从具体应用上看:
- DFS比较适合判断图中是否有环,寻找两个节点之间的路径,有向无环图(DAG)的拓扑排序,寻找所有强连通片(SCC),无向图中寻找割点和桥等;
- BFS则比较适合判断二分图,以及用于实现寻找最小生成树(MST),如在BFS基础上的Kruskal算法。还有寻找最短路径问题(如Dijkstra算法)。