ストリーミングされたデータから実行中の中央値を見つけるためのさまざまなソリューションがいくつかあります。回答の最後で簡単に説明します。
質問は、特定のソリューション (最大ヒープ/最小ヒープ ソリューション) の詳細に関するものであり、ヒープ ベースのソリューションがどのように機能するかを以下に説明します。
最初の 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) にも使用できるため、より一般的なソリューションです。最後に、正確な中央値が必要なく、近似値で十分な場合は、データの確率密度関数を推定し、それを使用して中央値を推定することができます。