Очевидно, что min и max в O(n) просты и не требуют кучи.
K-й самый большой можно сделать достаточно просто, поддерживая кучу k-размера верхних значений k на данный момент. Время выполнения будет O (n * logk). Вы могли бы назвать это линейным временем, если k имеет фиксированный размер и k ‹‹ n.
Я не думаю, что медиана возможна. Простое создание кучи размером O(n) требует времени O(n*logn).
Редактировать: Хорошо, если подумать, IVlad оказался прав. Вы можете создать кучу за O(n) фиксированного размера. Но ... это не помогает ОП с его медианным вопросом. Техника создания линейной кучи создает только допустимую кучу в качестве конечного результата. Простой подход к выполнению n вставок, приводящий к правильной куче после каждого шага, равен O(n*logn).
Мне кажется, что использование кучи для поиска медианы потребует использования этих работающих подкуч. Например, здесь был опубликован ответ (который, кажется, теперь удален), который ссылался на сообщение в блоге, предлагающее алгоритм для этой проблемы. Он отслеживал текущую медиану, используя две кучи (меньшую половину и большую половину), поскольку он выполняет один проход по данным. Это потребует более медленного, наивного подхода к куче, потому что он зависит от поддержания допустимых куч при вставке и удалении из них.
Есть ли другой способ найти медиану, используя линейную технику создания однократной кучи?
person
Alan
schedule
05.04.2010