Опубликован: 26.09.2006 | Доступ: свободный | Студентов: 1282 / 41 | Оценка: 4.25 / 4.12 | Длительность: 17:09:00
ISBN: 978-5-9556-0066-6
Специальности: Программист, Математик
Лекция 7:

Биномиальные и фибоначчиевы кучи

< Лекция 6 || Лекция 7: 12 || Лекция 8 >

Биномиальные кучи

Для каждого k = 0, 1, 2, \ldots биномиальное дерево B_k определяется следующим образом: B_0дерево, состоящее из одного узла высоты 0 ; далее при k = 1, 2, \ldots дерево B_k высоты k формируется из двух деревьев B_{k-1}, при этом корень одного из них становится потомком корня другого. На рис. 7.1 изображены биномиальные деревья B_0, B_1, B_2, B_3, B_4.

Биномиальный лес — это набор биномиальных деревьев, в котором любые два дерева имеют разные высоты.


Рис. 7.1.

Свойства биномиальных деревьев

  • Дерево B_k состоит из корня с присоединенными к нему корнями поддеревьев B_{k-1}\dts B_1, B_0 в указанном порядке.
  • Дерево B_k имеет высоту k.
  • Дерево B_k имеет ровно 2^k узлов.
  • В дереве B_k на глубине i имеется ровно C_k^i узлов.
  • В дереве B_k корень имеет степень k, остальные узлы имеют меньшую степень.
  • Для каждого натурального числа n существует биномиальный лес, в котором количество узлов равно n.
  • Максимальная степень вершины в биномиальном лесе с n узлами равна \log_2 n.
  • Биномиальный лес содержит не более \lfloor \log_2 n\rfloor биномиальных поддеревьев.

Чтобы убедиться в существовании биномиального леса из n узлов, представим n в двоичной системе счисления (разложим по степеням двойки) n = a_0 2^0 + a_1 2^1 + \ldots +a_s 2^s, где a_k \in \{0, 1\}. Для каждого k = 0, 1, 2 \dts s, такого, что a_k = 1, в искомый лес включаем дерево B_k.

Биномиальная куча — это набор биномиальных деревьев, узлам которых приписаны элементы взвешенного множества в соответствии с кучеобразным порядком, при котором вес элемента, приписанного узлу, не превосходит весов элементов, приписанных его потомкам.

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

\eq*{
[{\rm key}, {\rm parent}, {\rm child}, {\rm sibling}, {\rm degree}],
}
где {\rm key} — ключ (вес) элемента, приписанного узлу, {\rm parent} — родитель узла, {\rm child} — левый ребенок узла, {\rm sibling} — правый брат узла, {\rm
degree} — степень узла.

Доступ к куче осуществляется ссылкой на самое левое поддерево. Корни деревьев, из которых составлена куча, оказываются организованными с помощью поля {\rm sibling} в так называемый корневой односвязный список.

Поиск элемента с минимальным ключом. Поскольку искомый элемент находится в корне одного из деревьев кучи, элемент с минимальным ключом находится путем просмотра корневого списка за время O(\log n).

Слияние двух очередей. Две очереди H_1 и H_2 объединяются в одну очередь H следующим образом. Последовательно выбираются деревья из исходных очередей в порядке возрастания их высот и вставляются в результирующую очередь H, вначале пустую.

Если дерево B_i очередной высоты i присутствует лишь в одной из исходных очередей, то перемещаем его в результирующую очередь. Если оно присутствует в одной из исходных очередей и уже есть в результирующей очереди, то объединяем эти деревья в одно B_{i+1}, которое вставляем в H. Если B_i присутствует во всех трех очередях, то сливаем два из них в B_{i+1} и вставляем в H, а третье дерево B_i просто перемещаем в H. Трудоемкость — O(\log n).

Вставка нового элемента. Создается одноэлементная очередь из вставляемого элемента, которая объединяется с исходной очередью. Трудоемкость — O(\log n).

Удаление минимального элемента. Сначала в исходной куче H производится поиск дерева B_k, имеющего корень с минимальным ключом. Найденное дерево удаляется из H, его прикорневые поддеревья B_{k-1}\dts B_1, B_0 включаются в новую очередь H_1, которая объединяется с исходной очередью H. Трудоемкость — O(\log n).

Уменьшение ключа. Осуществляется с помощью всплытия. Трудоемкость — O(\log n).

Удаление элемента. Уменьшается ключ удаляемого элемента до -\fy, применяется всплытие, всплывший элемент удаляется как минимальный. Трудоемкость — O(\log n).

< Лекция 6 || Лекция 7: 12 || Лекция 8 >
Антон Сиротинкин
Антон Сиротинкин

на стр 6, лекции 3, Очевидно "Ck <= модуль(Gk(е))*b(k+1)" (1) - , подскажите что значит "модуль" и почему это очевидно...
 

Светлана Ведяева
Светлана Ведяева
Россия, Саратов
Оксана Пагина
Оксана Пагина
Россия, Москва