Структура данных для поиска медианы
Это вопрос интервью. Разработайте класс, который хранит целые числа и обеспечивает две операции:
пустая вставка (int k) int getMedian()
Я думаю, что я могу использовать BST так, чтобы insert
принимает O(logN) и getMedian
принимает O(logN) (для getMedian
Я должен добавить количество левых / правых детей для каждого узла).
Теперь мне интересно, если это самое эффективное решение, а лучшего нет.
4 ответа
Вы можете использовать 2 кучи, которые мы будем называть Left
а также Right
,Left
это Max-Heap
,Right
это Min-Heap
,
Вставка делается так:
- Если новый элемент
x
меньше корняLeft
тогда мы вставляемx
вLeft
, - Иначе мы вставим
x
вRight
, - Если после вставки
Left
имеет количество элементов, которое больше 1 от количества элементовRight
, тогда мы называем Extract-Max наLeft
и вставьте его вRight
, - Остальное если после вставки
Right
имеет количество элементов, которое больше, чем количество элементовLeft
, тогда мы называем Extract-Min наRight
и вставьте его вLeft
,
Медиана всегда является корнем Left
,
Так что вставка делается в O(lg n)
время и получение медианы делается в O(1)
время.
Смотрите этот вопрос переполнения стека для решения, которое включает в себя две кучи.
Вы также можете рассмотреть самобалансирующееся дерево. Если дерево полностью сбалансировано, то корневым узлом является ваша медиана. Скажем, дерево на один уровень глубже на одном конце. Затем вам просто нужно знать, сколько узлов находится на более глубокой стороне, чтобы выбрать правильную медиану.
Будет ли он разбивать массив целых чисел, который выполняет сортировку во время вставки с помощью алгоритма сортировки, предназначенного для целых чисел (http://en.wikipedia.org/wiki/Sorting_algorithm), если вы выберете своего кандидата среди O Кроме того, будучи немного более гибким, вы можете улучшить свою производительность, изменив алгоритм сортировки в соответствии со свойствами вашего ввода (вход почти отсортирован или нет...). Я в значительной степени автодидакт в информатике, но я бы так и поступил: проще, тем лучше.