广度优先或深度优先
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
的距离的数组,如果没有条目 >6
和 false
,则返回 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
的成本,如果你有两个朋友(A
和B
)一个人N
。
这些朋友有一个共同的朋友C
,但是,在您的算法第一次检查朋友A
的距离,成本为4
并标记为已访问时,他们无法检查朋友B
,这可能距离为3
。 Dijkstra 将帮助您进行检查。
Dijkstra 在O(|V|+|E|log|V)
中解决了这个问题
在https://en.wikipedia.org/wiki/Dijkstra%27s_algorithm查看更多信息
【讨论】:
O(|P| + |A|) 是本练习的要求,但感谢您解释解决此问题的另一种方法 完美,所以,我相信第一个问题对你的情况会更有帮助。以上是关于广度优先或深度优先的主要内容,如果未能解决你的问题,请参考以下文章