Вы можете сделать это с двумя кучами . Не уверен, что есть менее «надуманное» решение, но оно обеспечивает O(logn)
сложность времени, и кучи также включены в стандартные библиотеки большинства языков программирования.
Первая куча (куча A) содержит наименьшие 75% элементов, другая куча (куча B) - остальные (самые большие 25%). Первый имеет самый большой элемент сверху, второй - самый маленький.
- Добавление элемента.
Проверьте, является ли новый элемент x
<= <code>max(A). Если это так, добавьте его в кучу A
, в противном случае - в кучу B
.
Теперь, если мы добавили x
в кучу A и она стала слишком большой (содержит более 75% элементов), нам нужно удалить самый большой элемент из A
(O (logn)) и добавить его в кучу B (также O (LOGN)).
Похоже, если куча B стала слишком большой.
- Нахождение "0,75 медианы"
Просто возьмите самый большой элемент из A (или самый маленький из B). Требуется время O (logn) или O (1), в зависимости от реализации кучи.
редактировать
Как отмечалось Dolphin , нам нужно точно указать, насколько большой должна быть каждая куча для каждого n (если мы хотим получить точный ответ). Например, если size(A) = floor(n * 0.75)
и size(B)
- это остаток, то для каждого n > 0
, array[array.size * 3/4] = min(B)
.