【问题标题】:Graph discovery and cycle detection图发现和循环检测
【发布时间】:2014-02-16 12:00:38
【问题描述】:

考虑下面的图表

假设程序在时间 t = 0 开始执行并且最初发现了节点 A。在时间 t = 0 没有发现其他节点。在时间 t = 4 时,程序已发现上图中的所有节点,并返回其起始状态,从而完成一个循环。

我的问题如下:

  • 假设没有关于图形的先验信息,对于具有大量节点 (n > 1000) 和许多循环的图形(不一定像上面那样简单和直接),最好的方法是什么。 我不想在发现整个图表后检测循环。

【问题讨论】:

  • 图是否保证随时连通?对于一个新发现的边,是否需要检测它是否属于一个循环,找到它所属的某个循环,或者找到它所属的所有循环?
  • @user3290797 是的,它保证可以连接。

标签: algorithm graph cycle graph-algorithm


【解决方案1】:

您描述的方法几乎是 DFS - 选择一个分支 - 并尽可能多地开发它。

另一种常见的图发现算法是BFS - “发现”距离源 0 处的所有节点,然后在距离 1 处,......直到发现所有图。

请注意,DFS 的一种变体,它包含一个动态的“已访问”集(并允许重新发现已经发现但不在当前分支中的节点)可用于循环检测(假设您想要所有循环),但可能需要很长时间才能运行 - 因为图中可能有指数级的循环数

【讨论】:

  • 节点检测后循环检测。我想要一种方法,其中这两个检测按顺序工作,就像发现一个新节点然后循环检测检查新发现/遇到的节点是否代表一个循环。我不想在发现整个图表后检测循环。 – Synex 37 秒前
  • @Synex 我没有关注。你想检测所有的周期吗?如果有任何循环?如果您想要所有周期 - DFS 可以做到,请阅读答案的最后一段,它描述了它。
  • 是的。我想检测所有周期。但是,我看到的问题是,节点是按顺序发现的以及链接。如果节点 A 被识别,它并不一定意味着源自 A 的所有边都是已知的。可能在 t = 70 时会发现另一条边。这是在初始发现后重复遇到相同节点的动态图。所以 A 可以是大量循环的开始和结束。
【解决方案2】:

我不想给你解决方案,你应该自己尝试,
但这里有一些东西可以让你继续前进:
我在这里使用Depth First Search

initially all nodes grey

for each node
    mark it as white
    dfs(grey child)
    mark node black

dfs(node)
if(child node white) 
  CYCLE detected
else ...normal routine 

如果还是看不懂,我再细说。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多