.net NET中表示有向无环图的结构是什么?

.net NET中表示有向无环图的结构是什么?,.net,dictionary,tree,directed-acyclic-graphs,.net,Dictionary,Tree,Directed Acyclic Graphs,我正在考虑将一个函数表示为字典(整数的,列表(整数的)) 其中关键点是顶点ID,列表将包含沿边的所有目标顶点 稍后我将使用此结构来: 导出可能的上升和下降路径的列表 导出可能的下一个路径和可能的源路径的列表 派生叶节点列表 验证顶点之间的建议边 拓扑排序顶点 我的方法有问题吗?你过去是怎么做到的? 谢谢 编辑 我的方法的一个问题是,查找到顶点的源路径是一项昂贵的操作,因为它需要在整个字典中进行迭代。也许我感兴趣的是制作一个DAGVertex对象,暴露目标和源,我相信我会为我的节点创建实体,然后

我正在考虑将一个函数表示为
字典(整数的,列表(整数的))
其中关键点是顶点ID,列表将包含沿边的所有目标顶点

稍后我将使用此结构来:
  • 导出可能的上升和下降路径的列表
  • 导出可能的下一个路径和可能的源路径的列表
  • 派生叶节点列表
  • 验证顶点之间的建议边
  • 拓扑排序顶点

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

    编辑

    我的方法的一个问题是,查找到顶点的源路径是一项昂贵的操作,因为它需要在整个字典中进行迭代。也许我感兴趣的是制作一个
    DAGVertex
    对象,暴露
    目标

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

    如果您的需求永远不会改变,并且您完全确信这一点,那么您的方法可能是可行的,但是如果您可能会有需求变化,例如为节点和另一节点之间的每条路径分配“权重”,我相信这可能会很难做到。(我想通过这样做来解决它

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

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

    如果你的需求永远不会改变,并且你完全确信这一点,也许你的方法是可以的,但是如果你可能有需求变化,比如给一个节点和另一个节点之间的每条路径分配“权重”,我相信这可能很难做到

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

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


    获取叶节点列表也可以类似地完成–只需拥有当前叶节点列表(或
    字典(整数、布尔值)
    )。每当它成为叶节点时,向其添加一个节点,如果它不再是叶节点,则将其删除。

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


    获取叶节点列表也可以类似地完成–只需拥有一个当前叶节点列表(或
    字典(整型、布尔型)
    )。每当它成为叶节点时,向其中添加一个节点,如果它不再是一个,则将其删除。

    是否“DAG”是“”的首字母缩略词?是否“DAG”是“”的首字母缩略词?我曾考虑使用我自己的实体列表作为字典值,但我担心的是仅仅为了找到目标边缘而将数据从中拆开的成本。不,我正在使用数据库记录的PK自动编号验证它们之间的关系。我曾考虑使用我自己的实体列表作为字典值,但我担心的是unb的成本从他们那里获取数据只是为了找到目标边。不,我正在使用他们的PK自动编号验证DB记录之间的关系。是的,我也考虑过这一点。好建议。挫折包括跨两个字典复制数据:顶点A的传出边是顶点B的传入边,而顶点B只是两个相似的字典而已交换它们的键/值是的,我也考虑过。好建议。挫折包括跨两个字典复制数据:顶点A的传出边是顶点B的传入边,这两个相似的字典只是交换了它们的键/值