Построить Min-Max Heap за O(n) сложность по времени
Согласно википедии, это минимальная куча: https://en.wikipedia.org/wiki/Min-max_heap. Мне было интересно, есть ли способ построить эту кучу min-max в O(n). Я знаю, что вы можете сделать это как с минимальной кучей, так и с максимальной кучей, но я не уверен, каков будет подход к этому. Вставка элемента требует O(log n) временной сложности, и я чувствую, что такое дерево не может быть построено более эффективно, чем O(n log n), но я надеюсь, что у кого-то есть ответ. Благодарю.
1 ответ
Да, оно может. В вашем цикле сборки-кучи вы просто вызываете TrickleDown
так же, как вы бы с минимальной кучей или максимальной кучей. Эта функция будет перемещать элемент соответственно, в зависимости от того, находится ли он на минимальном или максимальном уровне.
См. Оригинальную статью Min-Max Heaps и Generalized Priority Queues для общей информации. В статье не реализована сборка кучи, но если вы напишите свой собственный, то вызовы TrickleDown
работает как положено. То есть:
for i = A.length/2 downto 0
TrickleDown(i)
TrickleDown
определяет, если i
находится на минимальном уровне или максимальном уровне, и вызывает соответствующий метод, TrickleDownMin
или же TrickleDownMax
,