识别依赖图中的循环

Identify Loops Within Dependency Map

我正在开发一个名为 ActiveTouch 的 gem。它用于创建复杂的触摸或缓存失效网络。目前,我正在尝试确定一种识别网络中环路的方法。

依赖关系映射的简化版本是一个散列,其中键代表模型,值代表接触的模型。

例如

{ 
  A => [B, C],
  B => [D, F],
  D => [A]
}

在这个例子中我们可以看到A和D之间存在依赖循环,A->B->D->A或者D->A->B->D

为了确定循环,我需要查看所有可能的路径。我怎样才能看到所有可能的路径,像这样:

[
  [A, B, D, A],
  [A, B, F],
  [A, C],
  ...
  [D, A, B, D]
]

Ruby 中的回复会很好,但任何语言都足够了。

基本上你的问题归结为在图中找到一个循环。

您已经将图表存储在此处,作为 adjacency list representation. Detecting cycles is a standard procedure and can be done with a DFS 算法。你从一些顶点和 运行 DFS 开始,直到你会看到一些顶点两次。

如果您有断开连接的图形,则对所有组件执行此操作。