【问题标题】:Shall I store a parent pointer in a tree/graph node?我应该将父指针存储在树/图形节点中吗?
【发布时间】:2010-12-28 20:23:39
【问题描述】:

我正在开发类似树/图的数据结构。 它应该更像一个有向无环图。 其中一个要求是找到从根到特定节点的路径,这意味着当用户选择一个节点时,从根开始的路径将被突出显示。

那么,问题是我应该在每个节点中存储一个父指针吗? 或者更一般的问题是我应该何时在每个节点中存储父指针? 有什么优点和缺点?

提前致谢!

ps。 parent pointer == 指向父节点的指针。

【问题讨论】:

  • 父指针 -> 这是否意味着指向父节点或其他东西的指针?

标签: c++ data-structures graph tree


【解决方案1】:

一般来说,只有当您要使用需要它的算法时,您才会将指针存储回父级。否则,就用于存储指针的内存和插入节点或重新平衡/重组树时更新这些指针的额外复杂性而言,这都是不必要的开销。

与树一起使用的典型算法(广度优先和深度优先搜索和遍历)不需要父指针,这就是为什么您的普通树实现通常不包含它们的原因。

您的“从根目录突出显示路径”要求可能会使父指针有用,尽管还有其他方法可以实现它。一般而言,应避免将冗余信息放入数据结构中,直到证明出于性能原因它们是必要的。

【讨论】:

    【解决方案2】:

    详细说明 Kristopher Johnson 的回复:“您应该只保留指向您需要它的父级的指针”。

    请记住,对于许多遍历树/图的算法,在遍历过程中,您是从父节点到子节点,因此您实际上手头有父指针。您可以使用此父指针(例如将其传递给递归函数),而无需支付将其保存在结构中的成本。

    另一点:对于一般图,这个问题与“我应该在我的节点中存储入边(除了出边之外)吗?”相同。如果您查看boost graph library,您会发现一个模板库允许您在编译时进行此选择。

    【讨论】:

      【解决方案3】:

      存储父指针的开销与更新树/图的频率以及其中的节点数有关。不为某些算法存储父指针的开销取决于它们运行的​​频率。我无法告诉您更新地图的频率或需要父指针的频率,但我的建议是实现两者并运行分析器,或者根据哪些操作需要更多时间做出某种逻辑决策。

      【讨论】:

        【解决方案4】:

        如果将来可以更改(扩展)此结构(并且对于大多数代码可能的),我建议推迟添加此链接,直到明确需要它为止。

        在使用代码时添加内容比删除要简单得多...

        但是在设计数据结构时考虑几个潜在的扩展仍然很有用...

        【讨论】:

          猜你喜欢
          • 2014-10-25
          • 1970-01-01
          • 1970-01-01
          • 2021-07-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-01-22
          • 2018-04-07
          相关资源
          最近更新 更多