首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何证明一个线性算法,该算法能识别图中的所有圈和长度,其中每个顶点正好有一个输出边。

如何证明一个线性算法,该算法能识别图中的所有圈和长度,其中每个顶点正好有一个输出边。
EN

Stack Overflow用户
提问于 2020-01-29 14:05:36
回答 1查看 145关注 0票数 0

考虑n个顶点上的有向图,其中每个顶点正好有一个输出边。这个图包括一个循环集合以及具有到圈的路径的附加顶点,我们称之为分支。描述一个识别所有循环并计算每个周期长度的线性时间算法。您可以假设输入是以数组A的形式给出的,其中Ai是i的邻居,因此图具有边(i,Ai)。

到目前为止,我对算法的方法基本上是标记我遍历过的顶点,每次一个顶点指向我遍历过的顶点,我就数一个循环,然后再转到下一个未访问的顶点。在这个过程中,我还有一个hashmap或者什么东西来记录每个节点被遍历的顺序,这样每当我识别一个循环时,我就可以计算出长度。(这是线性的吗?)然而,我对证明非常新,我不知道如何证明一个算法的正确性。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-29 14:21:25

如果允许您使用额外的内存,Python中的算法将是这样的。

代码语言:javascript
复制
colors = [0] ** N; # initialize N element array withe values of zero (not seen)
for i in range(N):
    v = i # current vertex
    if colors[v] != 0: continue # already seen
    colors[v] = 1 # seen
    v = A[v] # move to neighbor
    while colors[v] == 0:
       colors[v] = 1
       v = A[v] # move to neighbor
    # we have reached previously seen node; this is the start node of a cycle
    colors[v] = 2 # mark the start of a cycle
    cycle_len = 1
    v = A[v] # move to neighbor
    while colors[v] == 1:
       cycle_len += 1
       v = A[v] # move to neighbor
   print("got a cycle with length =", cycle_len)

其基本思想是使用三种颜色对已经访问过的节点和作为循环起点的节点进行不同的标记;显然,单个节点只能属于单个周期。

该算法是线性的,因为内部while循环只对以前未见过的节点执行。跳过已经看到的节点。在最坏的情况下,两个内部while循环都完全执行,但2*N仍然是O(N)。

使用hashmap不符合要求,因为hashmap的最坏情况时间复杂度不是线性的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59968798

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档