广度优先或深度优先

Posted

技术标签:

【中文标题】广度优先或深度优先【英文标题】:Breadth first or Depth first 【发布时间】:2020-06-03 16:04:56 【问题描述】:

有一种理论说六度分离是最高的 通过熟人链将人们联系起来的程度。 (你知道贝克 - 分离度1,贝克认识某人 你不知道 - 分离度2)

我们有一个人员列表P,列表A的相应熟人 在这些人当中,还有一个人x

我们正在尝试实施一种算法来检查人 x 是否尊重 六度分离。如果距离x,则返回true P 中的所有其他人最多为 6,否则为 false。

在最坏的情况下,我们将完成O(|P| + |A|)

为了实现这个算法,我考虑在邻接矩阵上实现一个邻接列表来表示带有顶点P 和边A 的图形G,因为邻接矩阵需要O(n^2) 来遍历。

现在我考虑使用 BFS 或 DFS,但我似乎无法找到为什么另一个更适合这种情况的原因。 我想使用 BFS 或 DFS 将与x 的距离存储在数组d 中,然后遍历数组d 以查看是否有任何Degree 大于6

DFS 和 BFS 具有相同的时间复杂度,但在大多数情况下,深度更好(更快?)找到大于 6 的第一个度数,而广度更好地同时排除所有度数 > 6

在 DFS 或 BFS 之后,我将遍历包含与人 x 的距离的数组,如果没有条目 >6false,则返回 true

使用 BFS,分离度总是在数组的末尾,这可能会导致更高的时间复杂度?

使用 DFS,分离度将随机分散在 Array 中,但在搜索早期获得高于 6 的分离度的机会更高。

我不知道如果在这里使用 DFS 或 BFS 是否对时间复杂度有任何影响。

【问题讨论】:

【参考方案1】:

BFS 和 DFS 的时间复杂度完全相同。这两种方法都会访问图的所有连接顶点,因此在这两种情况下,您都有O(V + E),其中V 是顶点数,E 是边数。

话虽如此,有时一种算法可能优于另一种算法,因为顶点访问的顺序不同。例如,如果要计算一个数学表达式,DFS 会方便得多。

在您的情况下,BFS 可用于优化图遍历,因为您可以在所需的分离程度级别简单地切断 BFS。所有具有所需(或更大)分离度的人都不会被标记为已访问。

使用 DFS 实现相同的技巧会更加复杂,因为正如您敏锐地注意到的那样,DFS 首先到达图表的“底部”,然后递归(或通过堆栈)向上返回级别。

【讨论】:

所以 BFS 的实现会比 DFS 更简单,因为 BFS 可以像你说的那样在所需的程度上截止,但是使用 BFS 或 DFS 仍然会导致相同的时间复杂度? 在纸面上它们仍然具有相同的最坏情况时间复杂度,但实际上运行时可能非常不同。【参考方案2】:

我相信你可以使用Dijkstra算法。

是一种更新路径的 BFS 方法,是路径具有较小的值。想想距离总是有1的成本,如果你有两个朋友(AB)一个人N

这些朋友有一个共同的朋友C,但是,在您的算法第一次检查朋友A 的距离,成本为4 并标记为已访问时,他们无法检查朋友B,这可能距离为3。 Dijkstra 将帮助您进行检查。

Dijkstra 在O(|V|+|E|log|V) 中解决了这个问题

在https://en.wikipedia.org/wiki/Dijkstra%27s_algorithm查看更多信息

【讨论】:

O(|P| + |A|) 是本练习的要求,但感谢您解释解决此问题的另一种方法 完美,所以,我相信第一个问题对你的情况会更有帮助。

以上是关于广度优先或深度优先的主要内容,如果未能解决你的问题,请参考以下文章

广度优先与深度优先

深度优先搜索法和广度优先搜索法

基本算法——深度优先搜索(DFS)和广度优先搜索(BFS)

深度优先和广度优先

广度优先搜索和深度优先搜索

图的广度、深度优先搜索和拓扑排序