package class_07;import java.util.Arrays;
import java.util.Comparator;
import java.util.PriorityQueue;
/*** * 一个数据流中,随时可以取得中位数**/
public class Code_04_MadianQuick {public static class MedianHolder {private PriorityQueue<Integer> maxHeap = new PriorityQueue<Integer>(new MaxHeapComparator());private PriorityQueue<Integer> minHeap = new PriorityQueue<Integer>(new MinHeapComparator());private void modifyTwoHeapsSize() {if (this.maxHeap.size() == this.minHeap.size() + 2) {this.minHeap.add(this.maxHeap.poll());}if (this.minHeap.size() == this.maxHeap.size() + 2) {this.maxHeap.add(this.minHeap.poll());}}public void addNumber(int num) {if (this.maxHeap.isEmpty()) {this.maxHeap.add(num);return;}if (this.maxHeap.peek() >= num) {this.maxHeap.add(num);} else {if (this.minHeap.isEmpty()) {this.minHeap.add(num);return;}     if (this.minHeap.peek() > num) {this.maxHeap.add(num);} else {this.minHeap.add(num);}}modifyTwoHeapsSize();}public Integer getMedian() {int maxHeapSize = this.maxHeap.size();int minHeapSize = this.minHeap.size();if (maxHeapSize + minHeapSize == 0) {return null;}Integer maxHeapHead = this.maxHeap.peek();Integer minHeapHead = this.minHeap.peek();if (((maxHeapSize + minHeapSize) & 1) == 0) {return (maxHeapHead + minHeapHead) / 2;}return maxHeapSize > minHeapSize ? maxHeapHead : minHeapHead;}}public static class MaxHeapComparator implements Comparator<Integer> {@Overridepublic int compare(Integer o1, Integer o2) {if (o2 > o1) {return 1;} else {return -1;}}}public static class MinHeapComparator implements Comparator<Integer> {@Overridepublic int compare(Integer o1, Integer o2) {if (o2 < o1) {return 1;} else {return -1;}}}// for testpublic static int[] getRandomArray(int maxLen, int maxValue) {int[] res = new int[(int) (Math.random() * maxLen) + 1];for (int i = 0; i != res.length; i++) {res[i] = (int) (Math.random() * maxValue);}return res;}// for test, this method is ineffective but absolutely rightpublic static int getMedianOfArray(int[] arr) {int[] newArr = Arrays.copyOf(arr, arr.length);Arrays.sort(newArr);int mid = (newArr.length - 1) / 2;if ((newArr.length & 1) == 0) {return (newArr[mid] + newArr[mid + 1]) / 2;} else {return newArr[mid];}}public static void printArray(int[] arr) {for (int i = 0; i != arr.length; i++) {System.out.print(arr[i] + " ");}System.out.println();}public static void main(String[] args) {boolean err = false;int testTimes = 200000;for (int i = 0; i != testTimes; i++) {int len = 30;int maxValue = 1000;int[] arr = getRandomArray(len, maxValue);MedianHolder medianHold = new MedianHolder();for (int j = 0; j != arr.length; j++) {medianHold.addNumber(arr[j]);}if (medianHold.getMedian() != getMedianOfArray(arr)) {err = true;printArray(arr);break;}}System.out.println(err ? "Oops..what a fuck!" : "today is a beautiful day^_^");}}

实现一个数据流中,随时可以取得中位数相关推荐

  1. 从一个数据流中取出中位数

    用两个堆来实现,堆中元素个数相差<=1, class Solution {     priority_queue<int, vector<int>, less<int&g ...

  2. Python中的堆实现:heapq 模块——利用堆结构实现快速访问数据流中的中位数

    堆结构 堆结构是一种优先队列,可以以任意顺序添加对象,并随时查找或删除最小(大)的元素,或者查找和删除前 K 个最小(大)元素.相比于列表方法min() / max(),这样做的效率要高得多. 堆结构 ...

  3. 剑指offer:面试题41. 数据流中的中位数

    题目:数据流中的中位数 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数 ...

  4. 《剑指offer》-- 序列化二叉树、二叉搜索树的第k个节点、数据流中的中位数、滑动窗口的最大值

    一.序列化二叉树: 1.题目: 请实现两个函数,分别用来序列化和反序列化二叉树. 2.解题思路: (1)根据前序遍历规则完成序列化与反序列化.所谓序列化指的是遍历二叉树为字符串:所谓反序列化指的是依据 ...

  5. 《剑指offer》数据流中的中位数

    题目:如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值. 解析: ...

  6. [剑指Offer] 数据流中的中位数

    题目描述 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值. 对 ...

  7. 牛客网 在线编程 数据流中的中位数

    题目描述 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值.我们 ...

  8. 【剑指offer】_18 数据流中的中位数

    题目描述 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值.我们 ...

  9. python 数据流中的移动平均值_剑指Offer-41-数据流中的中位数

    题目 题目描述 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值 ...

  10. 数据流中的中位数java_数据流中的中位数

    如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值. import ...

最新文章

  1. Java List 更换指定位置的元素
  2. oschina添加ssh公钥一记
  3. js的变量作用域 ,变量提升
  4. python培训比较好的机构-学Python哪个机构好?老男孩Python培训班
  5. 【poj1088 记忆话搜索】
  6. 彻底解决Git中文乱码问题
  7. “亚信科技杯”南邮第七届大学生程序设计竞赛之网络预赛 (K L题解)
  8. 【TensorFlow】:解决TensorFlow的ImportError: DLL load failed: 动态链接库(DLL)初始化例程失败...
  9. 两点补充——CSS3新属性以及弹性布局
  10. IBM软件OEM概览
  11. 机器学习朴素贝叶斯算法+tkinter库界面实现好瓜坏西瓜分类
  12. JavaWeb笔记:Html总结
  13. mybatis 控制台打印执行的SQL语句
  14. 胡润百富:华为成为中国最值钱消费电子企业 小米排名第二
  15. 120 - 算法 -找到n个无序数中的 第k个最小的数 快排的变体
  16. completable java_java8 CompletableFuture异步编程
  17. PreparedStatement详解
  18. Mac系统镜像文件(Monterey-Sierra,加部分OS X)
  19. 如何让网页字体文件大瘦身?前端字体优化知多D
  20. 最新iPhone X设计规范,详细完整的了解IOS设计规范。

热门文章

  1. 2021年湖南省长沙市房地产行业发展现状分析(附开发投资额、施工面积、商品房销售、待售面积等)[图]
  2. PHPUnit 入门
  3. HTML5--表单新特性使用自定义错误提示消息validity属性
  4. 离散数学学习笔记——第七讲——特殊关系和函数(5.4 哈斯图和特殊元素)
  5. 怎么让计算机文件格式显示,已知文件类型的扩展名如何设置显示与隐藏?
  6. 如何利用巨象指纹浏览器在twitter上找到精准客户
  7. Unityt涂抹擦除功能
  8. VS2010如何打开VS2012的项目
  9. 03 ,seaborn 颜色 : 正态分布图,多元正态分布,核密度估计图
  10. 32、Java高级特性——日期操作类、Date类、SimpleDateFormat类、Calendar类