面试问题:
下面编辑
给你一个数组.你做出2堆,一个minheap和另一个最大堆.现在使用O(nlog n)时间的这两个提供的堆,找到数组的中位数.
更正问题
数字随机生成并存储到(扩展)数组中.你如何跟踪中位数?
解
这个问题可以使用2堆来解决,而且中等值可以在O(1)时间内被访问.
解决方法
以下是您如何使用这两个堆.注意,我假设你不知道元素的数量,这就是为什么我们必须弹出,直到我们从最小堆中弹出大于或等于我们从最大堆中弹出的东西.注意,我们返回平均值,因为在{1,2,3,4}的集合的情况下,中位数实际上是2.5(两个“中间”值的平均值).我假设价值类型是双重的,但这显然是任何事情.这里:
double min = minheap.pop(); double max = maxheap.pop(); while(min < max) { min = minheap.pop(); max = maxheap.pop(); } return (min + max) / 2;
因为弹出是O(log n),我们必须弹出O(n / 2)值,这是O(n log n).
原文地址:https://www.jb51.cc/java/124502.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。