【问题标题】:Cyclic connected graph vs acyclic connected graph use case循环连通图与非循环连通图用例
【发布时间】:2020-05-08 21:17:34
【问题描述】:

我有一个具有这样结构和规则的图表:

Graph image

  1. 是有向连通循环图(从上到下节点的方向)。
  2. 任何父节点都可以有 0、1 或 2 个子节点。
  3. 子节点可以有 1 个或 2 个父节点(根节点 n_id_1 没有父节点)。
  4. 有左孩子和右孩子。父母可以有右孩子而没有左孩子,反之亦然(参见n_id_9n_id_2)。
  5. 如果父级 (n_id_9) 有左分支 (n_id_3 - n_id_8) 且没有右分支,则它始终成为左分支 (n_id_11) 子级的父级。

此时我看到了 2 个数据结构的解决方案:

选项 1. 像这样制作一个有向连通循环图(最明显的方式):


parent            children
   1                 2
   2                 3, 11
   3                 5, 6
   5                 9
   6                 4
   9                 10, 12
   4                 7
   12                8
   7                 8
   8                 11

我认为它的缺点 - 难以渲染和维护。

选项 2。制作一个有向连通无环图,其中每个父母可以有 3 个孩子:左、右和第三个(不知道如何更好地称呼它)。例如,n_id_2左孩子 n_id_3,没有 右孩子第三个孩子 n_id_11。对于失踪的孩子,我们应该指定null


parent            children (left, right, third)
   1                 2, null, null 
   2                 3, null, 11
   3                 5, 6, 8
   5                 9, null, null
   6                 4, null, null
   9                 null, 10, 12
   4                 7, null, null
   12                null, null, null
   7                 null, null, null
   8                 null, null, null

现在我们有了一个没有循环的树,因此渲染和遍历数据要容易得多。我看到了这个缺点 - 如果由于某种原因规格会改变 - 可能更难改变。我更喜欢这个。

所以问题是:

  1. 还有其他解决方案吗?

  2. 您如何看待我提供的解决方案?

感谢您的评价。

【问题讨论】:

    标签: algorithm performance optimization graph-theory


    【解决方案1】:

    这实际上取决于您需要在图表上执行哪些操作。根据您的评论,您只需要编辑图形而不执行任何昂贵的计算,因此从可用性的角度来看更适合您的表示。

    就个人而言,我会采用您的第二种解决方案,对于具有此类属性的图形来说,这似乎更自然,我只会描述它有点不同:
    该图可以表示为节点的序列,每个节点可能有一个右子分支和一个后继 strong>(也就是你所说的third)。两个子分支都是可选的;没有后继者意味着序列的结束。子分支又是一系列相同类型的节点。

    这为您提供了一个简单的递归结构,我觉得这很容易推理(当然是 YMMV)。

    附带说明:这个图不是循环的,只有它的无向对应物是。

    【讨论】:

    • 我希望在此图上执行的操作: - 将节点添加到图的任何部分; - 删除节点和所有后继者; - 移动分支、节点。无需分析或搜索。
    猜你喜欢
    • 1970-01-01
    • 2021-12-13
    • 2013-08-04
    • 2020-04-19
    • 2014-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-25
    相关资源
    最近更新 更多