【问题标题】:Which data structure can handle these demands?哪种数据结构可以处理这些需求?
【发布时间】:2014-02-08 08:07:07
【问题描述】:

我需要一个可以处理这些需求的数据结构: * 在 O(lg(n)) 中检索最小值 * 在 O(lg(n)) 中检索最大值 * 在 O(lg(n)) 中向数据结构中插入一个值

对于最大值和插入-我认为最大二进制堆可以处理这个问题,但是它不适用于最小值,因为最小值可以在大约 n/2 值的每个叶子中 - 换句话说 O (n) ?如果我错了,请告诉我。

另外,如果有人能帮我找到满足这些需求所需的数据结构,我将非常高兴。

非常感谢

【问题讨论】:

  • 两个堆怎么样?
  • 你只需要给它添加值,并检索最低和最高吗?听起来您只需要几个变量即可。
  • @LasseV.Karlsen:这有点取决于“检索”的含义。如果它意味着“以这样一种方式从数据结构中删除,以便我可以获得下一个最小的项目”,那么它需要的不仅仅是几个变量。我强烈怀疑他正在尝试实现双端优先级队列。

标签: algorithm data-structures time-complexity


【解决方案1】:

Min-max heap 就是你要找的。​​p>

【讨论】:

    【解决方案2】:

    您可以使用平衡二叉搜索树来执行此操作。在平衡的 BST 中插入值只需要 O(log n) 时间,您可以通过分别找到树中最左边和最右边的节点来读取最小值或最大值。

    或者,您可以查找双端优先级队列的各种实现,这在这里也可能有所帮助。它们比平衡的 BST 更复杂,并且大多数语言都没有为它们提供库,尽管它们更适合您的需求。

    希望这会有所帮助!

    【讨论】:

      【解决方案3】:

      另一个选项是skip list,它将在 O(1) 中给出最小值,在 O(log n) 中插入,在 O(log n) 中得到最大值。

      【讨论】:

        【解决方案4】:

        AVL 树就是你要找的!

        它基本上是一个 BST,但通过执行称为 rotation 的操作始终保持平衡。一直保持平衡,树的高度为lg(n),因此搜索max和min最多需要O(height) = O(lgn),插入也需要O(lgn)时间。

        看看this lecture,它非常清楚地解释了AVL树的工作原理,如何维护以及为什么要花费我上面提到的时间。您也可以在谷歌上搜索 AVL 树以获取更多信息。

        【讨论】:

          猜你喜欢
          • 2013-02-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-21
          • 2023-01-08
          • 2016-09-17
          • 1970-01-01
          相关资源
          最近更新 更多