Max-heap と Min-heap のように、Median-heap を実装して、特定の整数セットの中央値を追跡したいと考えています。API には、次の 3 つの機能が必要です。
insert(int) // should take O(logN)
int median() // will be the topmost element of the heap. O(1)
int delmedian() // should take O(logN)
配列 (a) 実装を使用して、配列インデックス k の子が配列インデックス 2*k および 2*k + 1 に格納されるヒープを実装したいと考えています。便宜上、配列はインデックス 1 から要素の入力を開始します。これは次のとおりです。私がこれまでに持っているもの: 中央ヒープには、これまでに挿入された整数の数を追跡するための 2 つの整数があり、現在の中央値 (gcm) と現在の中央値 (lcm) 未満です。
if abs(gcm-lcm) >= 2 and gcm > lcm we need to swap a[1] with one of its children.
The child chosen should be greater than a[1]. If both are greater,
choose the smaller of two.
他の場合も同様です。要素を沈めたり泳いだりする方法のアルゴリズムが思いつきません。数値が中央値にどれだけ近いかを考慮する必要があると思うので、次のようになります。
private void swim(int k) {
while (k > 1 && absless(k, k/2)) {
exch(k, k/2);
k = k/2;
}
}
しかし、私は完全な解決策を思いつくことはできません。