【问题标题】:What structure to represent Directed Acyclic Graph in .NET?在 .NET 中表示有向无环图的结构是什么?
【发布时间】:2011-03-30 23:16:42
【问题描述】:

我正在考虑将DAG 表示为Dictionary(Of Integer, List(Of Integer)) 其中键是顶点 ID,列表将包含沿边的所有目标顶点。

稍后我将使用这个结构来:

  • 可能的上升和下降路径的派生列表
  • 导出可能的下一个路径和可能的源路径的列表
  • 导出叶节点列表
  • 验证顶点之间的建议边
  • 拓扑排序顶点

    我的方法有问题吗?你过去是怎么做到的? 谢谢

    编辑
    我的方法的一个问题是找到顶点的 源路径 是一项昂贵的操作,因为它需要对整个字典进行迭代。制作一个暴露TargetsSourcesDAGVertex 对象可能符合我的兴趣

  • 【问题讨论】:

    标签: .net dictionary tree directed-acyclic-graphs


    【解决方案1】:

    您可以将图形表示为两个字典——一个用于传入边,一个用于传出边。这将使修改图形和内存消耗的时间增加一倍,但降低了从O(V + E)O(1) 获取到达某个顶点的边列表的时间复杂度。

    获取叶节点列表的方法与此类似——只需要一个当前叶节点列表(或Dictionary(Of Integer, Boolean))。每当它成为叶节点时添加一个节点,如果它不再是叶节点,则将其删除。

    【讨论】:

    • 是的,我也考虑过这一点。好建议。挫折包括跨两个字典的数据重复:顶点 A 的传出边是顶点 B 的传入边,这只是两个相似的字典,只是它们的键/值交换了
    【解决方案2】:

    我相信我会为我的节点创建实体,然后在我的方法中使用 OOP。

    如果您的需求永远不会改变并且您对此完全确定,也许您的方法是可以的,但如果您可能有需求变化,例如为节点和另一个节点之间的每条路径分配“权重”,我相信它可以很难做到。 (会通过做类似的事情来解决它;

    Dictionary<Int32, List<Int32, Dictionary<Int32, Int32>>
    

    ???)

    我觉得我的班级会有点像这样;

    public class GraphNode
    {
        private Int32 value;
        public Int32 Value
        {
            get { return this.value; }
        }
    
        private List<GraphNode> siblings;
        public ReadOnlyCollection<GraphNode> Siblings
        {
            get { return new ReadOnlyCollection<GraphNode>(siblings); }
        }
    
        public void AddSibling(GraphNode node)
        {
            if (this == node)
                throw new Exception("Can't assing a node to itself as a sibling");
    
            if (this.siblings.Contains(node))
                throw new Exception("This node is already contained in the siblings list");
    
            this.siblings.Add(node);
        }
    
        public GraphNode(Int32 value)
        {
            this.value = value;
            this.siblings = new List<GraphNode>();
        }
    }
    

    【讨论】:

    • 我考虑使用我自己的实体列表作为字典值,但我担心将数据从它们中拆箱以找到目标边缘的成本。
    • 不,我正在使用它们的 PK 自动编号验证数据库记录之间的关系。
    猜你喜欢
    • 2010-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-12
    • 2015-10-22
    • 2016-02-15
    • 1970-01-01
    • 2015-03-13
    相关资源
    最近更新 更多