13

我有一个像这样的多级依赖关系图,我需要检测该图中的任何循环引用。

A = B

B = C

C = [D, B]

D = [C, A]

有人有这样的问题吗?

有什么解决办法???

谢谢和对不起英语。

=========更新==========

我有另一种情况。

1

2 = 1

3 = 2

4 = [2, 3]

5 = 4

在这种情况下,我的递归代码在“4”引用中迭代了两次,但是这个引用不会生成无限循环。我的问题是要知道函数何时迭代引用不止一次并且不是无限循环,何时是无限循环,以通知用户。

1 = 4

2 = 1

3 = 2

4 = [2, 3]

5 = 4

这种情况与第二个例子有点不同。这会产生一个无限循环。我怎么知道案例何时产生无限循环?

4

3 回答 3

15

拓扑排序。维基百科上的描述很清楚,适用于您的所有示例。

基本上,您从一个没有依赖关系的节点开始,将其放入已排序节点的列表中,然后从每个节点中删除该依赖关系。对于你的第二个例子,这意味着你从 1 开始。一旦你删除了对 1 的所有依赖项,你就剩下 2。你最终将它们排序为 1、2、3、4、5 并看到没有循环。

对于您的第三个示例,每个节点都有一个依赖项,因此无处可开始。这样的图必须至少包含一个循环。

于 2009-08-28T15:04:32.910 回答
5

保留唯一标识节点的列表。尝试遍历整个树,但继续检查列表中的节点,直到你得到一个被称为子节点的节点,该节点已经存在于唯一列表中 - 从那里获取它(处理循环或根据您的要求简单地忽略它)

于 2009-08-28T14:59:46.960 回答
2

检测循环依赖的一种方法是记录排序算法检测到的依赖链的长度。如果链变得比节点总数长(由于循环重复),则存在循环依赖。这应该适用于迭代和递归算法。

于 2020-06-07T09:30:14.453 回答