Time complexity 广度优先还是深度优先

Time complexity 广度优先还是深度优先,time-complexity,depth-first-search,breadth-first-search,Time Complexity,Depth First Search,Breadth First Search,有一种理论认为六度的分离度是最高的 通过熟人链将人们联系起来的程度。 (你知道面包师-分离度1,面包师认识某人 您不知道-分离度2) 我们有一份人员名单,一份相应熟人的名单 在这些人中,有一个人x 我们正在尝试实现一种算法来检查personx是否尊重 六度分离。如果距离x 对于中的所有其他人,P最多为6,否则为false 我们正努力在最坏的情况下完成O(| p |+| A |) 为了实现这个算法,我考虑在邻接矩阵上实现一个邻接列表,用顶点p和边A表示图G,因为邻接矩阵需要O(n^2)遍历 现在我

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

我们有一份人员名单,一份相应熟人的名单 在这些人中,有一个人
x

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

我们正努力在最坏的情况下完成
O(| p |+| A |)

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

现在我考虑使用BFS或DFS,但我似乎找不到一个理由来解释为什么另一个更适合这种情况。 我想使用BFS或DFS将距离
x
的距离存储在数组
d
中,然后在数组
d
上循环,查看是否有大于
6
的度数

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

在DFS或BFS之后,我将在包含距离person
x
的数组上循环,如果没有条目
>6
false
,则返回
true

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

使用DFS时,分离度将随机分散在数组中,但在搜索早期分离度高于
6
的几率更高


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

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

也就是说,有时一种算法可能会优于另一种算法,因为顶点访问的顺序不同。例如,如果要计算一个数学表达式,DFS将更方便

在您的例子中,BFS可以用于优化图遍历,因为您可以简单地在所需的分离级别切断BFS。所有具有所需(或更大)隔离度的人员都将不标记为已访问


用DFS实现同样的技巧会复杂得多,因为正如您敏锐地注意到的那样,DFS首先进入图表的“底部”,然后逐级递归(或通过堆栈)返回。

我相信您可以使用Dijkstra算法

是一种BFS方法,用于更新路径,即路径值较小。想想看,距离总是要花费
1
,如果你有两个朋友(
a
B
),一个人就要花费
N

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

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


更多信息请参见

,因此BFS的实现比DFS更简单,因为正如您所说,BFS可以在所需的程度上切断,但使用BFS或DFS仍然会导致相同的时间复杂性?它们在纸面上仍然具有相同的最坏情况时间复杂性,但实际上运行时可能会非常不同。O(| p |+| A |)这是本练习的要求,但感谢您解释了解决此问题的另一种方法,非常完美,因此,我相信第一个问题将对您的情况更有帮助。