В чем разница между кучами и биномиальными кучами?

Мне нужно знать основное различие между двоичными и биномиальными кучами независимо от их структурной разницы, что двоичные кучи могут иметь только два дочерних (древовидное представление) и биномиальные кучи могут иметь любое количество детей.

На самом деле мне просто интересно, что то, что столь важно для организации структуры биномиального дерева таким образом, что первый ребенок имеет на одном node втором, имеет две трети из четырех и т.д.?

Что делать, если мы используем какое-то нормальное дерево для куч без ограничения двух дочерних элементов, а затем применим процедуру объединения и просто сделаем одну кучу левой дочерней частью других куч?

Ответы

Ответ 1

Ключевое различие между двоичной кучей и биномиальной кучей состоит в том, как структурируются кучи. В двоичной куче куча представляет собой единое дерево, которое является полным двоичным деревом. В биномиальной куче куча представляет собой коллекцию меньших деревьев (т.е. Лес деревьев), каждый из которых является биномиальным деревом. Полное двоичное дерево может быть построено для хранения любого количества элементов, но число элементов в биномиальном дереве некоторого порядка n всегда 2 n. Следовательно, нам нужно только одно полное двоичное дерево, чтобы вернуть двоичную кучу, но нам может понадобиться несколько биномиальных деревьев для поддержки биномиальной кучи. Интересно, что порядки биномиальных деревьев, используемые в биномиальной куче, соответствуют 1 битам, установленным в двоичном представлении числа элементов в лесу.

Причиной организации биномиальных куч как бы является то, что биномиальное дерево порядка n всегда имеет ровно 2 n узлов в нем. Это позволяет нам делать предположения о количестве элементов в биномиальном дереве, не имея необходимости проверять структуру этого дерева. С другой стороны, полное двоичное дерево некоторой высоты h может содержать в себе переменное количество узлов в зависимости от того, как заполняется последняя строка. Тот факт, что каждый из детей должен иметь точно определенную структуру, также может быть использован для доказательства того, что число детей не более O (log n), где n - общее количество узлов в куче, что означает, что стоимость удаления-мин не слишком велика.

Важной деталью этого является то, что биномиальная куча - это не любое дерево, в котором есть k детей. Это дерево, которое строго определено как

  • Биномиальное дерево порядка 0 - это единственный node и
  • Биномиальное дерево порядка n представляет собой одиночный node с биномиальными деревьями порядка 0, 1, 2,..., n - 1 в качестве детей.

(Технически, частный случай порядка 0 здесь не нужен). Вы можете увидеть это здесь:

Binomial trees!

Обратите внимание, что существует ровно одно дерево каждого порядка, без какой-либо гибкости в количестве или позиции узлов.

Однако важным альтернативным определением является следующее:

  • Биномиальное дерево порядка 0 - это единственный node и
  • Биномиальное древо порядка n - это два биномиальных дерева порядка n - 1, одно из деревьев сделало его дочерним.

(Потратьте минутку, чтобы понять, почему они эквивалентны). Используя это второе определение, это краткое доказательство индукции, показывающее, что число узлов в дереве 2 n. В качестве базового случая дерево порядка 0 имеет 2 0= 1 узлов по мере необходимости. Для индуктивного шага, если у нас есть два дерева порядка n - 1, они вместе имеют 2 n-1 + 2 n-1= 2 n по мере необходимости. Таким образом, общее число узлов в биномиальном дереве порядка n равно 2 n.

Идея кучи, которую вы описываете в своем последнем абзаце, не всегда приводит к эффективному времени выполнения. В частности, если у вас есть деревья с огромным коэффициентом ветвления и никакими другими структурными ограничениями, то теоретически можно построить кучу n узлов, состоящих из одного node с (n - 1) детей. В этом случае после удаления элемента минимума из кучи вам нужно будет посмотреть все n - 1 детей, чтобы определить, какой из них был новым минимумом, давая время выполнения O (n). Другие структурные ограничения на деревьях, такие как полные бинарные деревья, биномиальные деревья и т.д., Гарантируют, что этого худшего случая не произойдет.

Надеюсь, это поможет!

Ответ 2

Бинарная куча может быть создана путем объединения любых двух дочерних полных двоичных деревьев одного ранга на корень node. Это дерево с немного свободным стилем - некоторые листья можно вырезать справа

Биномиальное дерево ранга N не является лесом деревьев. Это корень node с связанными с ним биномиальными деревьями ранга N-1, N-2,..., 1,0. Биномиальная куча - дерево с абсолютно фиксированной структурой.

(Боюсь, кто-то читал Wiki не так). Биномиальное дерево порядка k имеет корень node, дети которого являются корнями биномиальных деревьев порядков k-1, k-2,..., 2, 1, 0 (в этом порядке).

Ответ 3

добавьте отличный ответ выше, предоставленный templatetypedef. Вот визуальная таблица, показывающая разную временную сложность для разных операций.

╔══════════════╦═══════════════════════╦════════════════════════╗
║  Operation   ║       Binary          ║      Binomial          ║
╠══════════════╬═══════════════════════╬════════════════════════╣
║              ║                       ║                        ║                              
║   insert     ║      O(logN)          ║      O(logN)           ║
║              ║                       ║                        ║                              
╠══════════════╬═══════════════════════╬════════════════════════╣
║  find Min    ║       O(1)            ║      O(logN)           ║
║              ║                       ║                        ║
╠══════════════╬═══════════════════════╬════════════════════════╣
║              ║                       ║                        ║
║   Revmove    ║       O(logN)         ║      O(logN)           ║
║              ║                       ║                        ║
╠══════════════╬═══════════════════════╬════════════════════════╣
║              ║                       ║                        ║
║ Decrease Key ║       O(logN)         ║      O(logN)           ║
║              ║                       ║                        ║
╠══════════════╬═══════════════════════╬════════════════════════╣
║              ║                       ║                        ║
║    Union     ║         O(N)          ║      O(logN)           ║
║              ║                       ║                        ║
╠══════════════╬═══════════════════════╬════════════════════════╣
║              ║ ■ Min element is root ║order k binomial tree Bk║
║              ║ ■ Heap height = logN  ║ ■ Number of nodes = 2k.║
║              ║                       ║ ■ Height = k.          ║                  
║              ║                       ║ ■ Degree of root = k.  ║
║  Useful      ║                       ║ ■ Deleting root yields ║
║  Properties  ║                       ║   binomial trees       ║
║              ║                       ║   Bk-1, … , B0.        ║
║              ║                       ║   (see graph below)    ║
║              ║                       ║                        ║
║              ║                       ║                        ║
║              ║                       ║                        ║
║              ║                       ║                        ║        
╚══════════════╩═══════════════════════╩════════════════════════╝

Я получил это изображение из слайды лекций Princeton

Двоичная куча: (почти полное двоичное дерево) Binary Heap

Биномиальная куча:

введите описание изображения здесь k bonomial trees