针对傻瓜的迭代/动态拓扑排序

时间:2014-07-15 01:55:20

标签: c++ sorting graph directed-acyclic-graphs topological-sort

我目前正在C ++中实现动态DAG图表 - 它将通过UI显示给用户,并且插入/删除节点/边缘将是常见操作。

图表的大小可能范围从非常小的规模到大的I-I,目的是支持数百万个节点。

因此,我正在寻找一种不会在内存中占用太多空间的最佳数据结构,同时也寻找一种通过快速多线程迭代快速插入/删除的方法。拓扑排序的节点(因此可以并行执行多个节点)。

我还没有完成任何剖析,看看每次修改完成时重新计算完整图形的拓扑类型的天真方法会削减它,但为了学习,我想我是&#39 ;而宁愿找到一种“更聪明”的方式。

我不知道如何处理图的多线程迭代但是一开始我偶然发现了一些与迭代/动态拓扑排序步骤相关的文章,问题是他们对我来说太聪明了。它进入理论/数学方面,缺乏具体的实施例子,可以帮助我理解正在发生的事情。

以下是此类论文的一个示例:A Labeling Approach to Incremental Cycle Detection

由于缺少诸如“傻瓜的迭代/动态拓扑排序”等论文,是否有人对主题有任何暗示?

2 个答案:

答案 0 :(得分:1)

动态toposort算法(未经测试)。

从拓扑排序的顶点序列开始。

  1. 如果添加了没有边的顶点,请将其插入序列中的任何位置。
  2. 如果删除了边或顶点,则不执行任何操作。
  3. 如果添加了前沿(从较低排序的顶点到较高排序的顶点),则不执行任何操作。
  4. 如果添加了新的后沿A→B,则在A之后直接移动B.将B的输出边缘标记为新。必要时重复第3点和第4点。 (如果可以移动多个顶点,则从排序最低的顶点开始;如果要移动的顶点有几个新的输入边,请从排序最高的顶点中选择一个)。如果在此过程中遇到两次相同的顶点,请报告一个循环。
  5. 算法本身并不检测周期,但您可以将周期搜索限制为移动的顶点子集。

答案 1 :(得分:1)

确实有关于动态toposort的工作。

Pearce&凯利http://homepages.ecs.vuw.ac.nz/~djp/dts.html有一个他们声称既简单又实用的算法。它们还提供C ++实现。通过介绍,他们讨论了更简单的变体。

以下是按时间顺序对此问题进行的一些后续工作。后来的方法往往比以前的方法更复杂。即使不是,后来的论文可能会假设您已经阅读过早期的论文。你显然是从这份清单上的最后一篇论文开始的,这篇论文可能已经深入到了最后。