有向循环图(F#)的数据结构和算法

时间:2010-06-24 09:02:26

标签: algorithm data-structures f# directed-graph

我正在尝试分析一个应用程序,其中程序集引用应该是一个有向非循环图,但不是。还有一个相关的问题,即子组件引用了一个子组件的不同版本(think Escher...

我想要做的是分析每个装配 - 子装配对,并建立一个错误位置的图片。

我需要一些关于什么是好的数据结构的指导。我不太确定我可以构建一个不可变的那个,但是我不介意在内部将它变为可变,然后在最后转换为不可变的。

问题的另一部分是我应该使用什么样的算法来填充数据结构,以及之后用于“分析”问题。

3 个答案:

答案 0 :(得分:3)

您可以使用NDepend,它会分析您的程序集并检测依赖项周期。

如果您真的想自己这样做,我会使用QuickGraph来建模依赖图,它还包括图算法,如拓扑排序。

答案 1 :(得分:2)

  

我不介意在内部将其变为可变,然后在最后转换为不可变。

您可能会发现在整个过程中使用不可变数据结构更容易。特别是,您可以轻松地将图表表示为从源节点到目标节点集的Map。对于拓扑排序,您希望有效访问目标节点的源节点,因此您可能希望使用另一个Map向相反方向扩充图形。

我刚刚用F#实现了这个,拓扑排序只有12行代码......: - )

答案 2 :(得分:1)

您想要做的是“拓扑排序”。维基百科有一个很好的概述:

http://en.wikipedia.org/wiki/Topological_sort