我研究了两种图形遍历算法,深度优先搜索和广度优先搜索。由于这两种算法都用于解决图遍历的相同问题,我想知道如何在两者之间进行选择。我的意思是还有一个效率高于其他或任何理由为什么我会在特定场景中选择一个而不是另一个?
谢谢
答案 0 :(得分:7)
对我而言,主要区别在于理论上的一些。如果你有一个无限大小的图形,那么DFS永远不会找到一个元素,如果它存在于它选择的第一条路径之外。它基本上会继续沿着第一条路走下去,永远找不到元素。 BFS最终将找到该元素。
如果图的大小是有限的,DFS可能会更快找到离群值(根和目标之间的距离更大)元素,而BFS会更快找到更接近的元素。除了在DFS选择浅元素的路径的情况下。
答案 1 :(得分:6)
一般而言,BFS更适用于寻找最短路径或某些相关问题的问题。因为在这里你从一个节点到达与它相邻的所有节点,因此你有效地从路径长度1移动到路径长度2,依此类推。
虽然另一端的DFS有助于解决连接问题以及查找图形中的周期(尽管我认为您也可以通过对BFS进行一些修改来找到周期)。确定与DFS的连接是微不足道的,如果从DFS过程调用两次探索过程,则图形将被断开(这是针对无向图的)。您可以在此处查看有向图的强连通分量算法,这是DFS的修改。 DFS的另一个应用是拓扑排序。
这些是两种算法的一些应用:
DFS:
连接
强连接组件
拓扑排序
BFS:
最短路径(Dijkstra是对BFS的修改) 测试图表是否为Bipartitie。
答案 2 :(得分:0)
对于完整/完美树,DFS相对于树的深度采用线性空间量,而BFS相对于树的深度采用指数量的空间。这是因为对于BFS,队列中的最大节点数与树的一个级别中的节点数成比例。在DFS中,堆栈中的最大节点数与树的深度成正比。
答案 3 :(得分:0)
当遍历多重连接的图时,遍历节点的顺序可能极大地影响(通过许多数量级)遍历方法要跟踪的节点的数量。使用广度优先时,某些算法会更好;使用深度搜索时,其他人会更好。
在一个极端情况下,对具有N个叶节点的二叉树进行深度优先搜索需要遍历方法跟踪lgN个节点,而广度优先搜索需要跟踪至少N / 2个节点(从它可能在扫描任何叶节点之前扫描所有其他节点;在扫描第一个叶节点之前,它会遇到N / 2个叶子的父节点,这些父节点必须单独跟踪,因为它们都没有相互引用。
另一方面,使用一种方法在NxN网格上进行泛洪填充,如果其像素尚未着色,那么像素的颜色然后泛光填充其邻居将需要排队O(N)像素如果使用广度优先搜索,则坐标,但如果使用深度优先,则使用O(N ^ 2)像素坐标。当使用广度优先搜索时,无论要绘制的形状如何,油漆都会“展开”;当使用深度优先算法绘制矩形螺旋时,每条线在一侧是直的而在另一侧是锯齿状的(哪一边应该是直的并且锯齿状取决于所使用的确切算法),所有直线部分都将被绘制在任何锯齿状之前,意味着系统必须分别跟踪每个锯齿的位置。