数据流中的中位数

这题看到大部分人都是使用大顶堆和小顶堆实现,但是java里面有一个更好的数据结构TreeMap可以帮我们实现排序的功能。这样找中位数就很简单了。算法本身实质是使用hashmap实现桶排序的方法,相比使用堆的方法,当数据重复量大时节省了存储空间,理解起来也很容易。代码如下:

    TreeMap treeMap = new TreeMap<Integer,Integer>();
    public void Insert(Integer num) {
        if(treeMap.containsKey(num)) {
            int sum = (Integer) treeMap.get(num);
            treeMap.replace(num, sum, sum + 1);
        }else {
            treeMap.put(num,1);
        }
    }

    public Double GetMedian() {
        int size = treeMap.size();
        Map.Entry entry = treeMap.firstEntry();
        int i = (int)entry.getValue();
        int mid = (size+1)/2;
        while(i < mid){
            entry = treeMap.higherEntry(entry.getKey());
            i += (int)entry.getValue();
        }
        if(size % 2 == 0 && i == mid){
                return ((int)entry.getKey() * 1.0 + (int)treeMap.higherEntry(entry.getKey()).getKey() * 1.0) / 2;
        }
        return (int)entry.getKey() * 1.0;
    }