一个稍微理论化的问题,但在这里仍是如此。
设置
让: UCYLE = {:G是一个无向图,包含一个简单的循环}。
我的解决方案
我们通过构造使用$ L $ space决定UCYLE的算法M来显示UCYLE在L中。
M =“输入时G =(V,E)
对于V中的每个v_i,对于Neighbor(v_i)中的每个v_j,存储当前的v_i和v_j
遍历边缘(v_i,v_j),然后使用DFS跟踪G中所有可能的路径。
如果我们遇到邻居(v_i)/ {v_j}中的v_k,以便E中有边(v_i,v_k),则接受ACCEPT。其他拒绝。“
首先我们声称M决定UCYLE。首先,如果$ G $中存在一个循环,那么它必须以某个顶点$ v_i $开始和结束,$ M $的第一步尝试所有这样的$ v_i $,因此必须找到所需的顶点。接下来,假设循环从$ v_i $开始,那么必须存在起始边缘$(v_i,v_j)$,这样如果我们按照循环,我们通过不同边缘$(v_k,v_i)回到$ v_i $ $,所以我们在第三步接受。由于图表是无向的,我们总是可以回到$ v_i $到$(v_i,v_j)$,但$ M $不接受这种情况。通过构造,如果我们在邻居(v_i)/ {v_j} $中遇到一些$ v_k,则$ M $也不会接受,但是从$ v_k $到$ v_i $没有优势。
现在我们显示M在L中。首先,如果顶点标记为$ 1,\ ldots,n $ where $ | \ mathbb V | = n $,然后需要$ log(n)$位来指定每个$ v_i $。 $ \ mathcal M $中的下一个注释我们只需要跟踪当前的$ v_i $和$ v_j $,因此M是$ 2 log(n)= O(log n),这是L
我的问题
我的问题是如何在$ log(n)$ space中的图表上执行DFS。例如,在每个顶点具有度$ n $的最坏情况下,您必须保留一个计数器,该计数器表示您在特定路径上采用的顶点,这需要$ n log(n)$空间。
答案 0 :(得分:2)
搜索时维护的状态是四个顶点:(v_i
,v_j
,prev
,current
)。
下一个状态是:(v_i
,v_j
,current
,v
)其中v
是current
的下一个邻居prev
(如果prev
是current
的数字最后一个邻居,则回到第一个。{/ p>
当current
是v_i
的邻居时停止,如果不是v_j
则拒绝。
在伪代码中,类似这样:
for v_i in vertices
for v_j in neighbours(v_i)
current, prev = v_j, v_i
repeat
idx = neighbours(current).index(v_j)
idx = (idx + 1) % len(neighbours(current))
current, prev = neighbours(current)[idx], current
until current adjacent to v_i
if current != v_j
return FOUND_A_CYCLE
return NO_CYCLES_EXIST
直观地说,对于迷宫中的每个点,以及从该点开始的每个走廊,请按照左侧墙,如果它不能通过原始时再次看到起点走廊然后你找到了一个周期。
虽然很容易看出这个算法使用O(log n)空间,但有必要证明该算法终止。