广度优先或深度优先

时间:2020-06-03 16:04:56

标签: time-complexity depth-first-search breadth-first-search

有一种理论认为六度分离是最高的 人们通过一连串的熟人联系在一起的程度。 (您知道贝克-分离度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的距离的数组,如果没有条目xtrue,则返回>6找到了。

使用BFS,分离度始终位于数组的末尾,这可能会导致更高的时间复杂度?

使用DFS,分离度将随机分散在Array中,但是在搜索初期,分离度高于false的机会就更高。

我不知道如果在这里使用DFS或BFS会对时间复杂度有什么影响。

2 个答案:

答案 0 :(得分:2)

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

话虽如此,有时一种算法可能比另一种算法更可取,这恰恰是因为顶点访问的顺序不同。例如,如果您要评估一个数学表达式,DFS会更加方便。

在您的情况下,BFS可用于优化图形遍历,因为您可以简单地以所需的分离度切断BFS。所有具有必要(或更大)隔离度的人都将被标记为未拜访。

使用DFS实施该技巧时会费时费力,因为您已经敏锐地注意到,DFS首先到达“图的底部”,然后递归地(或通过堆栈)返回上一层级别。

答案 1 :(得分:0)

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

是一种BFS方法,可更新您的路径,是该路径的值较小。认为距离总是要付出1的代价,并且如果一个人A有两个朋友(BN)。

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

Dijkstra在O(|V|+|E|log|V)

中解决了这个问题

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

相关问题