data-structures - 求中位数的数据结构

标签 data-structures language-agnostic selection

这是一道面试题。设计一个类,它存储整数并提供两个操作:

空插入(int k)
int getMedian()

我想我可以使用 BST 以便 insert取 O(logN) 和 getMedian需要 O(logN)(对于 getMedian 我应该为每个节点添加左/右 child 的数量)。

现在我想知道这是否是最有效的解决方案,没有更好的解决方案。

最佳答案

您可以使用 2 个堆,我们称之为 LeftRight .LeftMax-Heap .RightMin-Heap .
插入是这样完成的:

  • 如果新元素x小于 Left 的根然后我们插入 xLeft .
  • 否则我们插入 xRight .
  • 如果插入后LeftRight 的元素计数中具有大于 1 的元素计数,然后我们在 Left 上调用 Extract-Max并将其插入 Right .
  • 否则如果插入后 Right具有大于 Left 的元素计数的元素计数,然后我们在 Right 上调用 Extract-Min并将其插入 Left .

  • 中位数始终是 Left 的根.

    所以插入是在 O(lg n) 中完成的时间和获取中位数在 O(1) 中完成时间。

    关于data-structures - 求中位数的数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11361320/

    相关文章:

    javascript - webkit 浏览器中来自 getClientRects 的 clientRect 语义

    java - 大 O N^2 (Log N)

    android - 使用对象列表填充 Android Spinner

    ios - 如何在不担心索引的情况下添加到 NSDictionary?实际上是一个 NSArray,每个索引有多个元素。有更好的解决方案吗?

    生成字谜的算法

    algorithm - 解决问题的动态规划技术

    algorithm - 使用仿射成本优化笛卡尔请求

    jquery - 是否可以选择 <a> 标签内的文本?

    javascript - 在contenteditable中插入一个span,然后用户无法在刚刚插入的span之后和之后继续输入

    python - 重新排列优先级队列的优先级(有效方式)