Вы бы использовали кучу мин-макс-медиана, чтобы найти мин, макс и медиану в постоянное время (и потратить линейное время для построения кучи). Вы можете использовать деревья статистики заказов, чтобы найти kth наименьшее / наибольшее значение. Обе эти структуры данных описаны в этой статье о кучах min-max [pdf link] . Кучи Min-Max - это двоичные кучи, которые чередуются между min-heaps и max-heaps.
Из статьи: min-max-median heap - это двоичная куча со следующими свойствами:
1) Медиана всех элементов находится в корне
2) Левое поддерево корня представляет собой минимально-максимальную кучу Hl потолка размера [((n-1) / 2)], содержащую элементы, меньшие или равные медиане. Правое поддерево - это максимальная куча Hr размера пола [((n-1) / 2)], содержащая только элементы, большие или равные медиане.
В статье объясняется, как построить такую кучу.
Редактировать: После более тщательного прочтения статьи создается впечатление, что для построения кучи min-max-median необходимо сначала найти медиану (FTA: «Найти медиану всех n элементов с использованием любого из известных линейных значений времени). алгоритмы "). Тем не менее, после того, как вы построили кучу, вы можете поддерживать медиану, просто поддерживая баланс между кучей min-max слева и кучей max-min справа. DeleteMedian заменяет корень либо на минимальную кучу max-min, либо на максимальную кучу min-max (в зависимости от того, какой баланс поддерживается).
Так что, если вы планируете использовать кучу min-max-median, чтобы найти медиану фиксированного набора данных, вы SOL, но если вы используете его для изменяющегося набора данных, это возможно.