数据流中的中位数

来源:互联网 发布: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