ストリーミングされたデータから実行中の中央値を見つけるためのさまざまなソリューションがいくつかあります。答えの最後で簡単に説明します。
問題は、特定のソリューション(最大ヒープ/最小ヒープソリューション)の詳細についてであり、ヒープベースのソリューションがどのように機能するかを以下で説明します。
最初の2つの要素については、左側のmaxHeapに小さい要素を追加し、右側のminHeapに大きい要素を追加します。次に、ストリームデータを1つずつ処理します。
Step 1: Add next item to one of the heaps
if next item is smaller than maxHeap root add it to maxHeap,
else add it to minHeap
Step 2: Balance the heaps (after this step heaps will be either balanced or
one of them will contain 1 more item)
if number of elements in one of the heaps is greater than the other by
more than 1, remove the root element from the one containing more elements and
add to the other one
次に、いつでも次のように中央値を計算できます。
If the heaps contain equal amount of elements;
median = (root of maxHeap + root of minHeap)/2
Else
median = root of the heap with more elements
答えの冒頭で約束したように、私は一般的に問題について話します。データのストリームから実行中の中央値を見つけることは難しい問題であり、メモリの制約がある正確な解を効率的に見つけることは、一般的なケースではおそらく不可能です。一方、データに活用できる特性があれば、効率的な専門ソリューションを開発できます。たとえば、データが整数型であることがわかっている場合は、カウントソートを使用できます、これは、一定のメモリの一定の時間アルゴリズムを提供できます。ヒープベースのソリューションは、他のデータ型(double)にも使用できるため、より一般的なソリューションです。そして最後に、正確な中央値が不要で、近似が十分な場合は、データの確率密度関数を推定し、それを使用して中央値を推定することができます。