Почему двоичная куча лучше как массив, чем дерево?

При создании двоичной максимальной кучи, почему лучше реализовать ее как основанную на массиве, а не древовидную структуру (в основе дерева, как и в каждом node, также имеющий указатель на нее родительский)? С точки зрения анализа времени выполнения, использования памяти, производительности...

Для двоичной максимальной кучи время выполнения:

  • insert: O (lg n)
  • удалить мин: O (lg n)
  • merge: O (n)

Для реализации дерева

  • insert: O (lg n)
  • удалить мин: O (lg n)
  • merge: O (n)

Может ли кто-нибудь объяснить подробно?

Ответ 1

Дерево использует больше времени и памяти. Сложности одинаковы, но постоянные факторы различны.

Указатели дерева используют большую память, по сравнению с массивом на основе массива, где вам едва нужно какое-либо дополнительное пространство, кроме того, что оно берется самими значениями. И манипулирование этими указателями требует времени. Выделение и освобождение узлов может занять некоторое время и пространство...

Кроме того, нет гарантии, что узлы дерева будут объединены в памяти. Если какой-либо из двух альтернатив использует кеш, это куча массива.

Ответ 2

Со ссылкой на то, что уже было сказано через ответы других, можно задаться вопросом, почему мы не используем массивы и для BST. Двоичная куча требует, чтобы это было полное двоичное дерево. Поэтому глубина листовых узлов всегда h или h-1. Я считаю, что это свойство делает использование массивов идеальным для двоичных кучи и непригодным для BST (поскольку BST не имеет требования к полному двоичному дереву - оно может быть строгим/полным/полным).