【问题标题】:What data structure has these properties?什么数据结构具有这些属性?
【发布时间】:2021-10-25 21:55:21
【问题描述】:

我需要一个结构来存储数据,以便以下所有操作都是对数时间:

该结构表示唯一元素的有序列表。需要支持以下操作:

  1. 在列表的右端添加一个元素。
  2. 从列表中的任意位置删除一个元素。
  3. 获取列表的长度。
  4. 将给定索引处的元素放入列表中。
  5. 获取给定元素的索引。

例如,如果这个结构被实现为一个简单的 python 列表,则操作 1、3 和 4 是(摊销的)常数时间,其中 2 和 5 是线性的(5 可以相对容易地取对数,但 2仍然存在问题)。

我想到的唯一方法是有一个哈希表存储每个元素之前完成的插入次数,以及一个存储对的二叉搜索树(必须是自平衡的)@ 987654321@,其中i 是在值之前完成了多少次插入,并且是用于使其成为 BST 的顺序,此外每个节点还存储以它为根的子树的总大小(这需要每当任何节点发生变化时向上传播)。这似乎是一个过于复杂的方案,是否有更简单的结构可以在所有列出的操作中实现对数或更好的性能?

【问题讨论】:

    标签: data-structures


    【解决方案1】:

    这称为Order statistic tree,通常实现为自平衡二叉搜索树(例如红黑树),每个节点存储一个额外字段:以该节点为根的子树的大小。

    所有正常的 BST 操作都必须稍微修改以保持正确的大小,但是最后 3 个操作(获取长度、获取索引处的元素、获取元素的索引)都可以相当简单地实现。第一个只是根节点的大小字段;如果您知道“当且仅当小于 x 的元素数量为 k-1”时,其他两个操作会更容易,并且节点的左(分别为右)子树仅包含较小的(分别大于当前节点)元素。

    考虑 BST 中的搜索结构也很有帮助:从根开始,在 BST 中搜索“x”,如果“x”小于当前节点值,我们向左移动,然后向右移动如果当前节点及其整个左子树小于'x',则元素的索引正好是那些较小值的个数之和。

    【讨论】:

      猜你喜欢
      • 2023-04-07
      • 1970-01-01
      • 2015-09-07
      • 1970-01-01
      • 1970-01-01
      • 2011-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多