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

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

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

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


person Abdul Samad    schedule 02.06.2011    source источник
comment
Тогда балансировку сделать не получится. Операции не будут выполняться за время O(log n). Просмотрите доказательства для биномиальных куч и посмотрите, где они потерпят неудачу.   -  person ShreevatsaR    schedule 02.06.2011


Ответы (3)


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

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

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

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

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

Биномиальные деревья!

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

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

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

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

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

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

person templatetypedef    schedule 07.02.2012
comment
Я читал и читал в Интернете, и это все прояснило. Тщательный! - person Leon; 18.07.2013
comment
не могли бы вы ответить на этот вопрос: вопросы/19704385/? - person Jackson Tale; 31.10.2013
comment
отличный ответ! вы вдохновили меня поместить информацию в таблицу для визуализации - person OLIVER.KOO; 02.01.2018

добавьте к отличному ответу выше, предоставленному 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)    ║
║              ║                       ║                        ║
║              ║                       ║                        ║
║              ║                       ║                        ║
║              ║                       ║                        ║        
╚══════════════╩═══════════════════════╩════════════════════════╝

Я взял это изображение из слайдов лекций в Принстоне

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

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

введите здесь описание изображения k благотворных деревьев

person OLIVER.KOO    schedule 02.01.2018

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

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

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

person Gangnus    schedule 07.02.2012
comment
В двоичной куче немного больше структуры. Дерево должно быть полным бинарным деревом, а не просто обычным бинарным деревом, поэтому слияние двух полных бинарных деревьев разной высоты занимает время O(n + m). - person templatetypedef; 08.02.2012
comment
en.wikipedia.org/wiki/Binary_heap. Посмотрите на картинки в левом верхнем углу. Я не настаиваю, вики не является абсолютным авторитетом, но вы уверены? - person Gangnus; 08.02.2012
comment
@Gagnus- Это полные двоичные деревья - обратите внимание, что в них отсутствуют только узлы на нижнем уровне. :-) - person templatetypedef; 08.02.2012
comment
так какая разница? Как мы приходим к результату? - person Gangnus; 08.02.2012
comment
@Gangnus- я согласен с тем, что двоичная куча использует двоичное дерево, но вы не можете просто использовать любое обычное двоичное дерево и должны использовать полные двоичные деревья. Более того, вы не можете просто объединить два полных двоичных дерева так, как вы предложили, поскольку, если они имеют разную высоту, объединенное дерево не обязательно является полным двоичным деревом. Попробуйте объединить один узел и полное дерево высотой 100 так, как вы предлагаете; это определенно не полное бинарное дерево, когда вы закончите! - person templatetypedef; 08.02.2012
comment
Но когда вы обрезаете несколько листьев снизу, это тоже не полное бинарное дерево. - person Gangnus; 08.02.2012
comment
@Gangnus- При условии, что вы обрежете листья справа налево, да, это будет полное двоичное дерево. - person templatetypedef; 08.02.2012
comment
давайте продолжим это обсуждение в чате - person templatetypedef; 08.02.2012