В принципе, я согласен с ответом @amit.Я более подробно расскажу о реализации этого модифицированного BST.
Кучи могут делать findMin
или findMax
в O (1), но не в обеих в одной и той же структуре данных.С небольшой модификацией BST может делать и findMin
и findMax
в O (1).
В этом измененномBST, вы отслеживаете минимальный и максимальный узлы каждый раз, когда выполняете операцию, которая потенциально может изменить структуру данных.Например, в операции вставки вы можете проверить, больше ли минимальное значение, чем вновь вставленное значение, а затем назначить минимальное значение для вновь добавленного узла.Та же самая техника может быть применена к максимальному значению.Следовательно, этот BST содержит эту информацию, которую вы можете получить в O (1).(аналогично двоичной куче)
В этом BST (в частности, сбалансированном BST), когда вы pop min
или pop max
, следующее минимальное значение, которое должно быть назначено, является преемником минимумаузел, тогда как следующее максимальное значение, которое будет назначено, является предшественником узла max.Таким образом, он выполняет в O (1).Благодаря комментарию @JimMischel, приведенному ниже, нам нужно перебалансировать дерево, поэтому оно все равно будет работать O (log n).(аналогично двоичной кучи)
По моему мнению, обычно Heap можно заменить на сбалансированный BST, поскольку BST работает лучше почти во всех структурах данных кучи.Тем не менее, я не уверен, следует ли рассматривать Heap как устаревшую структуру данных.(Что ты думаешь?)
PS: Нужно дать перекрестную ссылку на разные вопросы: https://stackoverflow.com/a/27074221/764592