Как и Max-heap и Min-heap, я хочу реализовать Median-кучу, чтобы отслеживать медиану заданного набора целых чисел. API должен иметь следующие три функции:
insert(int) // should take O(logN)
int median() // will be the topmost element of the heap. O(1)
int delmedian() // should take O(logN)
Я хочу использовать реализацию array (a) для реализации кучи, где дети индекса массива k хранятся в индексах массива 2 * k и 2 * k + 1. Для удобства массив начинает заполнять элементы из индекса 1, Это то, что у меня есть до сих пор: Медианная куча будет иметь два целых числа, чтобы отслеживать количество вставленных до сих пор целых чисел, которые являются текущими медианными (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;
}
}
Я не могу придумать все решение.