Мне кажется, что Binary Search Tree может делать все, что может делать Binary куча, плюс дополнительные вещи.
| | Heap | Bal. BST |
---------------------------------------------
| Lookup min element | O(1) | O(1) |
---------------------------------------------
| Add an element | O(logn) | O(logn) |
---------------------------------------------
| Find and Remove | O(n) | O(logn) |
| an element | | |
---------------------------------------------
В результате поиска и удаления свойств возможно мутировать элемент, и мы можем в значительной степени гарантировать, что порядок все еще сохраняется после мутации в O(logn)
время
Преимущества, которые я вижу с помощью Binary Heap:
i) Проще реализовать
ii) Выделенная память является непрерывной (и, следовательно, более быстрый доступ)
(i) не является проблемой, так как я редко буду реализовывать любой из них с нуля. Если мы часто мутируем элементы, то (ii) не является существенным преимуществом.
Мне кажется, что сбалансированное двоичное дерево может делать все, что может делать двоичная куча, тогда почему оно не используется повсеместно? (Например, двусвязные списки используются повсеместно над одиночными связанными списками)