DFS 的计算复杂度

Computational complexity for DFS

我正在做一个 dfs,想知道我将如何比较两种过滤方法的 c 复杂度?

方法一:访问过则跳过。添加到队列然后删除似乎是一种浪费。

while queue
current = queue.deque
if visited current then continue //skip loop if visited
...

VS 添加前过滤[=​​12=]

while queue
current = queue.deque
foreach neighbor:
 if(not Visited && not queued) add //this seems like a lot of checking.

很想知道你是如何通过这个选择推理的。

两种方法的算法复杂度相同:O(m * n),其中m是要访问的元素总数,n是邻居数(假设是每个元素都相同)。

在第一种情况下,复杂性的“n”部分归因于向队列添加和删除元素+检查元素的访问状态。每个元素将恰好添加到队列中 n+1 次。

在第二种情况下,复杂度的“n”部分来自访问+排队检查。这些检查将对每个元素精确执行 n 次。

这种算法复杂度的差异是常量,O 表示法省略了常量。