Как и Max-heap и Min-heap, я хочу реализовать медианную кучу, чтобы отслеживать медиану заданного набора целых чисел. 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)
Я хочу использовать массив (а) реализацию для реализации кучи, где дети индекса массива K сохраняется в индексах массива 2 * к и 2 * к + 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;
}
}
Я не могу придумать все решение, хотя.
Это будет получить трудно без ограничения кратности любого заданного значения. – greybeard