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

Материал из testwiki
Перейти к навигации Перейти к поиску

Шаблон:Значения

Пример биномиальной кучи, содержащий элементы с ключами от 1 до 13

Биномиальная куча (Шаблон:Lang-en) — структура данных, реализующая абстрактный тип данных «очередь с приоритетом».

Конструируется как набор биномиальных деревьев — объектов, задаваемых рекуррентно следующим образом:[1]

  • биномиальное дерево нулевого ранга состоит из одной вершины;
  • биномиальное дерево ранга k представляет собой вершину и k детей, ранг которых последовательно уменьшается с k1 до 0.

Таким образом, биномиальное дерево ранга k содержит 2k вершин и имеет Ckd вершин на глубине d, в честь чего оно и получило своё название.

Из двух деревьев ранга k1 можно образовать одно ранга k путём подвешивания одного из них к корню другого в качестве k-ой ветви.

Биномиальная куча обладает двумя свойствами:

  • ключ каждой вершины не меньше ключа её родителя;
  • все биномиальные деревья имеют разный размер.

Из этих свойств вытекают два следствия. Во-первых, корень каждого из деревьев имеет наименьший ключ среди его вершин. Во-вторых, суммарное количество вершин в биномиальной куче однозначно определяет размеры входящих в неё деревьев. Например, биномиальная куча с 13=23+22+20 вершинами состоит из трёх деревьев высотой 3, 2 и 0 и имеющих, соответственно, 8, 4 и 1 элементов.

Следующие операции выполняются за время O(logn), где n — число вершин:

  • вставка нового элемента (амортизационная сложность — O(1)),
  • нахождение элемента с минимальным ключом,
  • удаление элемента с минимальным ключом,
  • уменьшение значения ключа данного элемента,
  • удаление данного элемента,
  • объединение двух куч.

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

Примечания

Шаблон:Примечания

Шаблон:Структуры данных Шаблон:Деревья (структуры данных)