设计一个支持getMedian功能的队列

use*_*359 6 algorithm data-structures

这是一个面试问题.您需要设计一个包含整数值的队列,并且具有一个getMedian()函数,该函数返回当前队列的中值元素.您可以使用O(n)额外空间.

可以用时间复杂度<O(n)实现getMedian()吗?

例如:当队列具有以下值(2,1,2,2,6,4,2,5)时,此方法返回2并且不删除该对象.

Yar*_*neo 9

您的问题的已知实现如下:

你需要实现的是2堆,一个是最小堆,另一个是最大堆.
您还需要一个整数来告诉我们队列中的对象数量.

堆的约束如下:
1.最小堆将具有队列
2 的较大对象.最大堆将具有队列
3 的较小对象.最大堆将具有相同或1个以上对象比你的最小堆

这样,如果你有一个奇数个对象,那么中位数就是你的最大堆中的最大对象.如果你有一个偶数个对象,你的中位数将是你的两个根的平均值(最大堆的最大值,最小堆的最小值).

重要的是要注意,如果您的堆变得不均匀,例如,如果您将从某个堆"弹出",则需要从其他堆中移除并移动它.但这不是问题,因为您需要处理的只是堆积物的根源而已.

getMedian的时间复杂度变为O(1)

刚刚找到一篇关于这个主题的文章:链接

回答评论

max-heap保存半个最小的元素.
向队列添加新编号时,首先要检查队列中的对象数.
如果要添加的数字是偶数,则表示需要将其添加到max-heap,因为两个队列的大小相等.
然后,您可以看到max-heap中的最大值.
如果它大于你的数字,你可以将它插入max-heap.
如果它更小,意味着你的新数字可能大于最小堆中的数字.
所以你看看min-heap中的min是多少.
如果你的数字小于min,那么你可以将它插入max-heap中,如果它更大,那么你将min-heap中的min移动到max-heap,然后在min-中插入你的新数字堆.
如果数字是奇数,则需要添加到最小堆,因为最大堆还有一个,依此类推.

它有点复杂,但如果你仍然不明白我不介意psuedo为你编码