这是一道面试题。设计一个类,它存储整数并提供两个操作:
空插入(int k)
int getMedian()
我想我可以使用 BST 以便 insert
取 O(logN) 和 getMedian
需要 O(logN)(对于 getMedian
我应该为每个节点添加左/右 child 的数量)。
现在我想知道这是否是最有效的解决方案,没有更好的解决方案。
最佳答案
您可以使用 2 个堆,我们称之为 Left
和 Right
.Left
是 Max-Heap
.Right
是 Min-Heap
.
插入是这样完成的:
x
小于 Left
的根然后我们插入 x
至 Left
. x
至 Right
. Left
从 Right
的元素计数中具有大于 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/