我正在处理图形问题,使用未加权的无向图,使用邻接列表表示,并且我使用DFS查找任何后边缘以便能够删除它们。问题是我无法弄清楚这个程序的计算复杂性。
我的DFS仅与DFS_visit子例程中的原始DFS不同,因为我没有使用时间戳。我将在这里发布子程序:
DFS_visit (G=(V,E), u):
color[u] = Grey
for each v \in Adj[u]
if color[v] = White
\pi[v] = u
DFS_visit (G, v)
if (u, v) is a back edge
Adj[u].remove(v)
Adj[v].remove(u)
color[u] = Black
"删除"过程探索邻接列表,直到找到v,然后将前一个节点(下一个节点为v)链接到v。旁边的节点(完成here) 因此,假设删除过程中的每个其他操作都可以在恒定时间内完成,那么它应该是最坏的情况Big O(| Adj [u] |)过程(当v是Adj [u]中的最后一个元素时发生)。
现在,在正常的DFS中,多次调用DFS_visit(每个节点一次)。正常的DFS_visit是一个\ Theta(E)程序(因为每个节点只访问一次,而\ sum(| Adj [u] |)= 2 * E),但在我的程序的最坏情况下会发生什么? 现在我唯一的想法是每个后边缘都会调用两次删除。但我无法找出任何上限或任何有助于计算整个DFS计算复杂性的内容。