数据流中的中位数
这题看到大部分人都是使用大顶堆和小顶堆实现,但是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;
}
京公网安备 11010502036488号