数据流中的中位数
来源:互联网 发布:windows api 窗口置顶 编辑:程序博客网 时间:2024/04/27 16:33
如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。
思路:最简单的就是直接排序,不过用两个堆来维护数据流更加高效。
一个大顶堆和一个小顶堆,保证大顶堆的最大值小于小顶堆的最小值,中位数就直接由堆顶元素确定了
import java.util.*;public class Solution { public Comparator<Integer>cmp=new Comparator<Integer>(){ public int compare(Integer a,Integer b) { return b-a; } }; Queue<Integer>pq1=new PriorityQueue<>(); Queue<Integer>pq2=new PriorityQueue<>(11,cmp); public void Insert(Integer num) { if(pq1.size()==pq2.size()){ if(pq1.isEmpty()){ pq1.add(num); } else{ if(pq1.peek()>num){ pq2.add(num); } else{ pq1.add(num); } } } else if(pq1.size()>pq2.size()){ if(pq1.peek()>num){ pq2.add(num); } else{ pq2.add(pq1.poll()); pq1.add(num); } } else{ if(pq2.peek()<num){ pq1.add(num); } else{ pq1.add(pq2.poll()); pq2.add(num); } } } public Double GetMedian() { if(pq1.size()!=pq2.size()){ if(pq1.size()>pq2.size()){ return new Double(pq1.peek()); } else{ return new Double(pq2.peek()); } } else{ return new Double((pq1.peek()+pq2.peek())/2.0); } }}
0 0
- 数据流中的中位数
- 数据流中的中位数
- 求数据流中的中位数
- 数据流中的中位数
- 数据流中的中位数
- 数据流中的中位数
- 数据流中的中位数
- 数据流中的中位数
- 数据流中的中位数
- 数据流中的中位数
- 【63】数据流中的中位数
- 数据流中的中位数
- 数据流中的中位数
- Q64:数据流中的中位数
- 数据流中的中位数
- 数据流中的中位数
- 数据流中的中位数
- 数据流中的中位数
- android之Service(服务)
- Java基础入门-java中的static使用
- Poi2010 Railway
- Miller Rabin
- hibernate 缓存机制详细分析
- 数据流中的中位数
- 白帽、灰帽和黑帽
- C++ 处理输入包含特定信息的字符串
- 51nod 1107 逆序对
- 【struts2】Action的实现
- 大话数据结构读书笔记 3---串
- 程序是如何执行的(三)函数调用
- gem install安装报SSL证书错误的解决办法
- 逆序建立链表