Мне кажется, что двоичное дерево поиска может делать все, что может двоичная куча, плюс дополнительные вещи.
| | 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) не является значительным преимуществом.
Мне кажется, что сбалансированное бинарное дерево может делать все, что может бинарная куча, тогда почему оно не используется повсеместно? (Подобно тому, как двусвязные списки используются повсеместно вместо односвязных списков)