有一种理论认为,六度相隔是人与人之间通过熟人链联系的最高程度。 (你知道贝克------------------------------------------相隔度
1
贝克认识一个你不认识的人 分开的程度。2
)我们有一份人员名单
P
列表A
在这些人中有相应的熟人,而一个人x
我们正在尝试实现一种算法,以检查人的
x
尊重六度分隔。它返回true
如果距离x
同行P
最多为6,否则为假。我们正在努力完成
O(|P| + |A|)
在最坏的情况下。
为了实现这个算法,我想到了在邻接矩阵上实现一个邻接列表来表示Graph G
有顶点 P
和边缘 A
因为相邻矩阵将以 O(n^2)
来穿越。
现在我想过使用BFS或DFS,但我似乎找不到一个理由来解释为什么另一个在这种情况下是更理想的。x
阵列 d
,然后在数组上循环 d
查看是否有任何学位大于 6
.
DFS和BFS具有相同的时间复杂度,但在大多数情况下,Depth在寻找第一度大的情况下,要比 6
而广度则更能排除所有度数的影响 > 6
同时进行。
在DFS或BFS之后,我将循环处理包含人与人之间距离的数组。x
,并返回 true
如果没有进入 >6
和 false
当找到一个时。
使用BFS,分离度总是在数组的最后,这可能会导致更高的时间复杂度?
在DFS中,分离度会随机地分散在阵列中,但是有一个分离度高于1.5的机会。6
在搜索的早期是比较高的。
我不知道这里如果用DFS或者BFS,对时间复杂度有没有什么区别。
BFS和DFS的时间复杂度是完全一样的。两种方法都会访问图的所有连接的顶点,所以在这两种情况下,你有 O(V + E)
,其中 V
是顶点的数量,而 E
是边的数量。
这就是说,有时一种算法比另一种算法更受欢迎,正是因为它的 顶点访问顺序 是不同的。例如,如果你要评估一个数学表达式,DFS会更方便。
在你的情况下,BFS可以用来优化图的遍历,因为你可以简单地在所需的分离度水平上切断BFS。所有具有所需(或更大)分离度的人都将不被标记为被访问过。
同样的技巧在DFS中实现起来会更加复杂,因为正如你敏锐地注意到的那样,DFS首先到达图的 "底部",然后再递归地(或通过堆栈)逐层向上。
我相信你可以使用 Dijkstra 算法。
是一个BFS的方法,更新你的路径,是路径有一个较小的值。认为作为距离总有一个成本的 1
而且,如果你有两个朋友(A
和 B
)对一个人来说 N
.
这些朋友有一个共同的朋友 C
但是,在第一次你的算法中,你的算法会检查朋友的距离。A
连本带利 4
并标记为已访问,他们不能检查朋友的。B
的距离,可能有 3
. Dijkstra将帮助你做检查。
Dijkstra解决这个问题的方法是 O(|V|+|E|log|V)