【发布时间】:2013-11-27 15:26:38
【问题描述】:
我遇到了wait-for graphs,我想知道,是否有任何有效的算法来检测向有向图添加边是否会导致循环?
有问题的图是可变的(它们可以添加或删除节点和边)。而且我们对真正了解违规循环并不感兴趣,只要知道有一个就足够了(以防止添加违规边缘)。
当然可以使用一种算法来计算强连接组件(例如 Tarjan 的)来检查新图是否是非循环的,但是每次添加边时再次运行它似乎效率很低。
【问题讨论】:
-
你有记忆或时间限制吗?
-
@MarkElliot 这些图表用于协调许多并发运行的线程的锁定。我希望这个图有几十到几百个节点,边的数量可能是节点数量的二次方。图表会经常更新,所有更新都需要检查,如果不引起循环。
-
一个幼稚的开始方法是在可以到达当前节点的节点的每个节点上携带一个数据结构。这将使循环检测在添加和更新时变得便宜,但增加了删除的复杂性。我想知道是否有更适合跟踪这个的数据结构(邻接矩阵?),但我仍在思考。
-
从描述中听起来边缘移除将与添加一样频繁,这几乎排除了任何数据缓存,因为移除会使一切无效(或者至少我不知道如何避免这种情况)。因此,我的猜测是,最简单的解决方案(当添加边缘
A->B,从B填充并检查A是否无法访问)将是最有效的。 -
@PetrPudlák 你能改进你从托马斯的答案中遗漏的东西吗?我认为这个问题得到了回答。您希望在插入时检测周期?
标签: graph-theory directed-graph cyclic-graph