Вы можете удалить из двоичной кучи за O (log n) время, используя следующий алгоритм:
- Возьмите элемент, который нужно удалить, и используйте операцию всплывающего окна, чтобы поменять его с его родителем.пока он не достигнет вершины кучи.
- Используйте стандартный шаг удаления двоичной кучи, чтобы удалить верхний элемент кучи и перебалансировать его.
Этот первый шаг занимает O (logn) время, потому что вам нужно переместить элемент полностью к вершине кучи, что занимает время, пропорциональное высоте кучи (O (log n)), а второй шаг также требует O (log n).Таким образом, если вы можете найти элементы для удаления из каждой кучи за время O (log n), вы можете удалить элементы из двух куч за время O (log n).
Один из способов сделать этодополнить две кучи хеш-таблицами или бинарными деревьями поиска, отображающими значения в куче в их позиции.Таким образом, когда вам нужно удалить запись из одной или обеих куч, вы можете посмотреть в хеш-таблице, где в двоичных кучах искать элемент, и затем использовать описанную выше процедуру для удаления элементов.Возможно, вам придется обновить код для кучи элементов для обновления этих таблиц при перемещении элементов.
В качестве альтернативы, если вам не нужно хранить элементы в двоичных кучах, вы можете рассмотреть возможность хранения всех элементов.в сбалансированных бинарных деревьях поиска.Вы можете выполнять все стандартные операции очереди приоритетов на BST за O (log n), но также можете легко удалять элементы из очереди приоритетов на основе BST за O (log n), используя стандартный шаг удаления BST.
Надеюсь, это поможет!