【问题标题】:Is there data structure supports fast insert and median calculation? [duplicate]是否有支持快速插入和中位数计算的数据结构? [复制]
【发布时间】:2020-05-26 04:02:30
【问题描述】:

我需要一个支持以下操作的数据结构:

  1. 插入一个数字;
  2. 找出所有插入数字的中位数;
  3. (附加)查找所有插入数字的预先已知分位数(0-1);

最简单的方法是在每次插入后对数字进行排序,但这并不快。有更快的解决方案吗?

【问题讨论】:

  • 因为你必须查看所有插入的数字来解决 2 和 3,所以 List 就足够了。
  • 你见过这个 SO 问题吗? How to calculate the median of an array?
  • @Abra,TreeSet 不支持通过索引直接访问,所以在这种情况下获取中值并不快。
  • @Abra,链接的问题是我需要的。谢谢!
  • this 有帮助吗?

标签: java algorithm optimization data-structures


【解决方案1】:

好吧,如果您最初知道数组的内容开始排序,您可以使用此属性进行二分搜索以查找键是否存在,如果不存在,则应将其插入到哪里.您可以然后在该点插入值,数据将继续保持“排序”状态。有点老派,是的,但它会很有效。

【讨论】:

    【解决方案2】:

    您可以使用两个二进制堆在 O(logN) 中执行操作 (1) 和在 O(1) 中执行操作 (2)(也许您也可以快速执行操作 (3),我只是不太熟悉概率论)。

    创建一个最大堆L 和一个最小堆R。创建两个变量ab,它们将存储一个(或两个)中间元素。堆L 将存储所有小于中间元素的元素,堆R 将存储所有大于中间元素的元素。 LR 的大小将始终相同。

    插入(x):

    • 如果数据结构中的元素计数是奇数(a 存储中间元素,b 不存储任何内容):
      • 如果x < a
        • b = a
        • a = x
      • 如果x >= a
        • b = x
    • 如果数据结构中的元素个数是偶数(ab 存储两个中间元素):
      • 如果x < a
        • b 放入R
        • x 放入L
        • b = null
      • 如果x > b
        • x 放入R
        • a 放入L
        • a = b
        • b = null
      • 如果a <= x <= b
        • a 放入L
        • b 放入R
        • a = x
        • b = null

    GetMedian():

    • 只需返回a(如果元素数为奇数)或(a + b) / 2(元素数为偶数)

    【讨论】:

      【解决方案3】:

      平衡的二叉搜索树可以通过每个节点的子树的大小来扩充。在树旋转期间保持此统计是恒定时间,您可以使用它来找到 O(log N) 中任何 i 值的第 i 个元素:

      • i < size(left):向左递归。
      • i == size(left):返回当前节点。
      • i > size(left):设置i = i - size(left) - 1并向右递归。

      这样的数据结构将使所有三个操作的 O(log N) 绑定。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-06-03
        • 1970-01-01
        • 2015-11-10
        • 2014-03-22
        • 1970-01-01
        • 2021-09-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多