在日志空间中解决无向图中的循环?

时间:2015-04-15 02:22:19

标签: algorithm graph cycle

一个稍微理论化的问题,但在这里仍是如此。

设置

让: UCYLE = {:G是一个无向图,包含一个简单的循环}。

我的解决方案

我们通过构造使用$ L $ space决定UCYLE的算法M来显示UCYLE在L中。

M =“输入时G =(V,E)

  1. 对于V中的每个v_i,对于Neighbor(v_i)中的每个v_j,存储当前的v_i和v_j

  2. 遍历边缘(v_i,v_j),然后使用DFS跟踪G中所有可能的路径。

  3. 如果我们遇到邻居(v_i)/ {v_j}中的v_k,以便E中有边(v_i,v_k),则接受ACCEPT。其他拒绝。“

  4. 首先我们声称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)$空间。

1 个答案:

答案 0 :(得分:2)

搜索时维护的状态是四个顶点:(v_iv_jprevcurrent)。

下一个状态是:(v_iv_jcurrentv)其中vcurrent的下一个邻居prev(如果prevcurrent的数字最后一个邻居,则回到第一个。{/ p>

currentv_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)空间,但有必要证明该算法终止。