中央値のデータ・ストリーム
タイトル説明
データ・ストリームの中央値を取得する方法?数の値は、データストリームから読み込む場合は、驚くべきことに、並べ替え後の全ての中間値の中央値に位置しています。偶数値は、データストリームから読み出された場合、中央値は、すべてのソートされた値のうち2つの数の平均値です。
アイデア解析
最大コンテナとデータのための右のコンテナのデータの最小値で実装スタック、ヒープを残しました。まず、データの数が1よりも小さくなるように平均データが2つのスタック、2つのスタックに割り当てられていることを確認することはしたがって、差分データの総数が最小ヒープ、スタックまたは最大挿入に新しいデータで偶数ではありません。コードは以下の通りであります:
import java.util.Comparator;
import java.util.PriorityQueue;
public class Solution {
PriorityQueue<Integer> minHeap=new PriorityQueue<>();
PriorityQueue<Integer> maxHeap=new PriorityQueue<>(20,new Comparator<Integer>(){
@Override
public int compare(Integer o1, Integer o2) {
return o2-o1;
}
});
private int count=0;
public void Insert(Integer num) {
count++;
if(count%2==0){
if(!maxHeap.isEmpty()&&maxHeap.peek()>num){
maxHeap.add(num);
num=maxHeap.poll();
}
minHeap.add(num);
}else{
if(!minHeap.isEmpty()&&minHeap.peek()<num){
minHeap.add(num);
num = minHeap.poll();
}
maxHeap.add(num);
}
}
public Double GetMedian() {
if(maxHeap.size()==minHeap.size()){
return (maxHeap.peek()+minHeap.peek())/2.0;
}else if(maxHeap.size()>minHeap.size()){
return maxHeap.peek()*1.0;
}else {
return minHeap.peek()*1.0;
}
}
}