广度优先搜索或深度优先搜索?

时间:2013-05-23 09:35:00

标签: python algorithm graph

我正在实施一个包含100,000多个节点的巨大有向图。我刚刚开始python所以我只知道这两个搜索算法。如果我想找到任意两个节点之间的最短距离,哪一个会更有效率?还有其他我不知道的方法会更好吗?

感谢您的时间

4 个答案:

答案 0 :(得分:1)

BFS和DFS确实有其他几种替代方案。

一个非常适合计算最短路径的是:http://en.wikipedia.org/wiki/Dijkstra's_algorithm

Dijsktra的算法基本上是BFS算法的改编,如果你的图是加权的,它比搜索整个图更有效。

就像@ThomasH所说的那样,如果你有一个加权图,Djikstra只是相关的,如果每个边的权重是相同的,它基本上默认回到BFS。

如果选择在BFS和DFS之间,那么BFS更适合于找到最短路径,因为您在移动到距离较远的节点之前完全探索节点的紧邻区域。

这意味着如果存在大小为3的路径,则在算法继续探索距离4处的节点之前,将探索它。

使用DFS,您没有这样的保证,因为您深入探索节点,您可以找到刚刚探索过的较长路径,并且您需要浏览整个图形以确保这是最短路径。

至于为什么你会得到挫折,大多数SO问题都应该显示出一些努力来寻找解决方案,例如,有关DFS与BFS的利弊的几个相关问题。

下次尝试确保您搜索了一下,然后询问有关您的任何具体疑问的问题。

答案 1 :(得分:1)

看看以下两种算法:

  1. Dijkstra's algorithm - 单一来源最短路径
  2. Floyd-Warshall algorithm - 所有对最短路径

答案 2 :(得分:0)

如果图表上的边没有权重,则可以进行简单的广度优先搜索,您可以迭代地访问图中的节点,并检查是否有任何新节点等于目标节点。如果边缘有权重,DJikstra的算法和Bellman-Ford算法是你应该看的东西,这取决于你正在看的预期时间和空间复杂性。

答案 3 :(得分:0)

当您想要找到最短路径时,您应该使用BFS而不是DFS,因为BFS会首先探索最近的节点,因此当您到达目标时,您确定使用了最短路径并且可以停止搜索。 DFS一次只探索一个分支,所以当你达到目标时,你不能确定没有另一条通过另一个分支的路径更短。

所以你应该使用BFS。

如果你的图形边缘有不同的权重,那么你应该使用Dijkstra算法,它是BFS对加权图形的改编,但是如果你没有权重则不要使用它。

有些人可能会建议您使用Floyd-Warshall算法,但对于这么大的图表来说这是一个非常糟糕的主意。

相关问题