【问题标题】:Can I represent a red black tree as an array?我可以将红黑树表示为数组吗?
【发布时间】:2017-07-24 23:19:06
【问题描述】:

是否值得将红黑树表示为数组以消除内存开销。或者数组会占用更多内存,因为数组会有空槽?

【问题讨论】:

  • 首先,您将如何在数组中表示 RBT?编辑您的问题以添加此详细信息!
  • 我将使用 c 进行编码。打开 -O3。
  • 我的问题是:你将如何使用数组?您将如何表示数组中的红色和黑色节点,以及如何维护 5 个属性等?回答这些问题。然后我们可以给你一个答案。
  • 红黑树的开销并不比任何其他数据结构多。与大数据集的数据检索的好处相比,添加到树的旋转是最小的。如果使用(结构)数组来替换树,则会丢失树在遍历时提供的所有关系排序。您可以将数据存储在您选择的任何数据结构中,具体取决于您将如何使用数据以及您的性能要求。
  • 我猜@jsho 将使用一个数组,因为它用于二进制堆:根值在数组中具有索引 1,对于具有索引N 的值左子具有索引N*2 ,右孩子有索引N*2 + 1,父母有索引N div 2。对于红黑树,您将需要两个数组,一个用于值,一个用于颜色。如果您对颜色使用一些设置,则可以节省一些内存。

标签: c arrays data-structures red-black-tree


【解决方案1】:

红背树(实际上是大多数数据结构)并不关心使用哪种存储工具,这意味着您可以使用数组甚至 HashTable/Map 来存储树节点,数组索引或映射键是你的新“指针”。如果愿意,您甚至可以将树作为文件放在磁盘上,并使用文件偏移作为节点索引(不过,在这种情况下,您应该改用 B-Tree)。

主要问题是复杂性增加,因为现在您必须手动管理存储(与让操作系统和/或语言运行时为您管理相反)。有时您希望扩大阵列以便存储更多项目,有时您希望缩小阵列(真空)以释放未使用的空间。这些操作本身的成本可能很高。

在内存使用方面,存储设施不会改变树上的节点数。如果您的老派指针er 树上有 2,000 个节点(树高=10),那么您的花哨数组ilized 树上仍然有 2,000 个节点(树高为还是 10)。但是,真空操作之间可能存在冗余空间。

【讨论】:

    【解决方案2】:

    是的,你可以将红黑树表示为一个数组,但这并不值得。

    红黑树的最大高度为 2*log2(n+1),其中 n 为条目数。每个级别的数组表示中的条目数为 2**n,其中 n 是级别。因此,要存储 1_000 个条目,您必须分配 1_048_576 个条目的数组。要存储 1_000_000 个条目,您必须分配 1_099_511_627_776 个条目的数组。

    不值得。

    【讨论】:

      【解决方案3】:

      它既有积极的一面,也有消极的一面。这个答案适用于 C [因为你提到这是你将使用的]

      积极的一面

      1. 假设您已经创建了一个数组作为对象池,将用于红黑树。找到位置后删除元素或初始化新元素会有点快,因为您可能会使用自己创建的内存池。

      消极的一面

      1. 是的,阵列很可能最终会占用更多内存,因为阵列有时会有空槽。
      2. 在这种情况下,您必须确定红黑树的最大大小。所以有大小限制。
      3. 您没有使用顺序内存空间的好处,因此可能会浪费资源。

      【讨论】:

        猜你喜欢
        • 2011-09-08
        • 1970-01-01
        • 2013-02-01
        • 2016-03-18
        • 2019-07-09
        • 1970-01-01
        • 2012-10-11
        • 2011-01-31
        • 2022-12-10
        相关资源
        最近更新 更多