有一种理论认为六度分离是最高的 人们通过一连串的熟人联系在一起的程度。 (您知道贝克-分离度
1
,贝克认识某人 您不知道-分离度2
)我们有一个人
P
的列表,一个A
个相应的熟人的列表 在这些人中,还有一个人x
我们正在尝试实现一种算法,以检查
x
人是否尊重 六个分离度。如果距true
的距离,则返回x
P
中的所有其他人最多为六个,否则为假。我们想在最坏的情况下完成
O(|P| + |A|)
。
要实现此算法,我考虑过在邻接矩阵上实现一个邻接列表,以用顶点G
和边P
来表示图A
,因为邻接矩阵将采用{ {1}}遍历。
现在,我考虑过使用BFS或DFS,但是对于这种情况,我似乎找不到原因来说明为什么另一个更为理想。
我想使用BFS或DFS将距O(n^2)
的距离存储在数组x
中,然后循环遍历数组d
以查看是否有任何度数大于d
DFS和BFS具有相同的时间复杂度,但是在大多数情况下,找到一个大于6
的第一个度数,深度更好(更快?),而同时覆盖所有度数6
的广度更好。
在DFS或BFS之后,我将遍历包含与人> 6
的距离的数组,如果没有条目x
和true
,则返回>6
找到了。
使用BFS,分离度始终位于数组的末尾,这可能会导致更高的时间复杂度?
使用DFS,分离度将随机分散在Array中,但是在搜索初期,分离度高于false
的机会就更高。
我不知道如果在这里使用DFS或BFS会对时间复杂度有什么影响。
答案 0 :(得分:2)
BFS和DFS的时间复杂度完全相同。两种方法都访问图形的所有连接的顶点,因此在两种情况下都具有O(V + E)
,其中V
是顶点数,E
是边数。
话虽如此,有时一种算法可能比另一种算法更可取,这恰恰是因为顶点访问的顺序不同。例如,如果您要评估一个数学表达式,DFS会更加方便。
在您的情况下,BFS可用于优化图形遍历,因为您可以简单地以所需的分离度切断BFS。所有具有必要(或更大)隔离度的人都将被标记为未拜访。
使用DFS实施该技巧时会费时费力,因为您已经敏锐地注意到,DFS首先到达“图的底部”,然后递归地(或通过堆栈)返回上一层级别。
答案 1 :(得分:0)
我相信您可以使用 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上查看更多信息