Биномиальная куча — различия между версиями
(→Union) |
(→Операции над биномиальными пирамидами) |
||
Строка 38: | Строка 38: | ||
Рассмотрим операции, которые можно производить с биномиальной пирамидой. Их асимптотические оценки показаны в таблице. | Рассмотрим операции, которые можно производить с биномиальной пирамидой. Их асимптотические оценки показаны в таблице. | ||
{| border="1" | {| border="1" | ||
− | | | + | |makeHeap |
|<tex>\Theta(1)</tex> | |<tex>\Theta(1)</tex> | ||
|- | |- | ||
− | | | + | |insert |
|<tex>O(\log(n))</tex> | |<tex>O(\log(n))</tex> | ||
|- | |- | ||
− | | | + | |getMinimum |
|<tex>O(\log(n))</tex> | |<tex>O(\log(n))</tex> | ||
|- | |- | ||
− | | | + | |extractMin |
|<tex>\Theta(\log(n))</tex> | |<tex>\Theta(\log(n))</tex> | ||
|- | |- | ||
− | | | + | |merge |
|<tex>\Omega(\log(n))</tex> | |<tex>\Omega(\log(n))</tex> | ||
|- | |- | ||
− | | | + | |decreaseKey |
|<tex>\Theta(\log(n))</tex> | |<tex>\Theta(\log(n))</tex> | ||
|- | |- | ||
− | | | + | |delete |
|<tex>\Theta(\log(n))</tex> | |<tex>\Theta(\log(n))</tex> | ||
|} | |} | ||
− | === | + | === makeHeap === |
− | Для создания пустой биномиальной | + | Для создания пустой биномиальной пирамиды процедура makeBinomialHeap просто выделяет память и возвращает объект H, где head[H] = null, то есть пирамида не содержит элементов. |
− | === | + | === getMinimum === |
Для нахождения минимального элемента надо найти элемент в списке корней с минимальным значением (предполагается, что ключей, равных <tex>\infty</tex>, нет). | Для нахождения минимального элемента надо найти элемент в списке корней с минимальным значением (предполагается, что ключей, равных <tex>\infty</tex>, нет). | ||
Строка 72: | Строка 72: | ||
[[Файл:Example2.jpg|300px]] | [[Файл:Example2.jpg|300px]] | ||
− | === | + | === merge === |
Эта операция, соединяющая две биномиальные кучи в одну, используется в качестве подпрограммы большинством остальных операций. | Эта операция, соединяющая две биномиальные кучи в одну, используется в качестве подпрограммы большинством остальных операций. | ||
Строка 83: | Строка 83: | ||
[[Файл:Example3.jpg|300]] | [[Файл:Example3.jpg|300]] | ||
− | Пример пирамиды до | + | Пример пирамиды до merge и после: |
[[Файл:Example5.jpg]] | [[Файл:Example5.jpg]] | ||
− | === | + | === insert === |
Необходимо просто создать биномиальную пирамиду <tex>H'</tex> с одним узлом за время <tex>O(1)</tex> и объединяет ее с биномиальной пирамидой Н, содержащей n узлов, за время <tex>O(\log(n))</tex>. | Необходимо просто создать биномиальную пирамиду <tex>H'</tex> с одним узлом за время <tex>O(1)</tex> и объединяет ее с биномиальной пирамидой Н, содержащей n узлов, за время <tex>O(\log(n))</tex>. | ||
− | === | + | === extractMin === |
Приведенная ниже процедура извлекает узел с минимальным ключом из биномиальной кучи и возвращает указатель на извлеченный узел: | Приведенная ниже процедура извлекает узел с минимальным ключом из биномиальной кучи и возвращает указатель на извлеченный узел: | ||
<code> | <code> | ||
− | + | extractMin(H) | |
поиск корня х с минимальным значением ключа в списке корней Н, и удаление х из корней Н | поиск корня х с минимальным значением ключа в списке корней Н, и удаление х из корней Н | ||
H' = Make_Binomial_Heap() | H' = Make_Binomial_Heap() | ||
Строка 108: | Строка 108: | ||
Все действия выполняются за время <tex>O(\log n)</tex>, так что общее время работы процедуры есть <tex>O(\log n)</tex>. | Все действия выполняются за время <tex>O(\log n)</tex>, так что общее время работы процедуры есть <tex>O(\log n)</tex>. | ||
− | === | + | === decreaseKey === |
Следующая процедура уменьшает ключ элемента x биномиальной кучи, присваивая ему новое значение. Вершина, ключ которой был уменьшен, «всплывает» наверх. Процедура выполняется за время <tex>O(\log n)</tex>, поскольку глубина вершины x есть <tex>O(\log n)</tex> (свойства биномиального дерева), а при выполнении каждого шага алгоритма мы поднимаемся вверх. | Следующая процедура уменьшает ключ элемента x биномиальной кучи, присваивая ему новое значение. Вершина, ключ которой был уменьшен, «всплывает» наверх. Процедура выполняется за время <tex>O(\log n)</tex>, поскольку глубина вершины x есть <tex>O(\log n)</tex> (свойства биномиального дерева), а при выполнении каждого шага алгоритма мы поднимаемся вверх. | ||
Строка 128: | Строка 128: | ||
[[Файл:Example6.jpg|600px]] | [[Файл:Example6.jpg|600px]] | ||
− | === | + | === delete === |
Удаление ключа сводится к двум предыдущим операциям: мы уменьшаем ключ до минимально возможного значения, а затем удаляем вершину с минимальным ключом. В процессе выполнения процедуры это значение всплывает вверх, откуда и удаляется. Процедура выполняется за время <tex>O(\log n)</tex>. | Удаление ключа сводится к двум предыдущим операциям: мы уменьшаем ключ до минимально возможного значения, а затем удаляем вершину с минимальным ключом. В процессе выполнения процедуры это значение всплывает вверх, откуда и удаляется. Процедура выполняется за время <tex>O(\log n)</tex>. | ||
Версия 21:05, 5 марта 2012
Определение: |
Биномиальное дерево дерево, определяемое для каждого следующим образом: - дерево, состоящее из одного узла высоты 0, то есть состоит из одного узла; состоит из двух биномиальных деревьев , связанны вместе таким образом, что корень одного из них является крайним левым дочерним узлом корня второго дерева. | —
Пример биномиального дерева для k = 0, 2, 3.
Свойства биномиальных деревьев. Биномиальное дерево
с n вершинами:- имеет узлов;
- имеет высоту k;
- имеет ровно узлов на высоте ;
- имеет корень степени k; степерь всех остальных вершин меньше степени корня биномиального дерева;
- максимальная степень произвольного узла в биномиальном дереве с n узлами равна .
Определение: |
Биномиальная пирамида (куча) H — представляет собой множество биномиальных деревьев, которые удовлетворяют следующим свойствам биномиальных пирамид.
|
Содержание
Представление биномиальных куч
Поскольку количество детей у узлов варьируется в широких пределах, ссылка на детей осуществляется через левого ребенка, а остальные дети образуют односвязный список. Каждый узел в биномиальной пирамиде (куче) представляется набором полей:
- key — ключ (вес) элемента;
- parent — указатель на родителя узла;
- child — указатель на левого ребенка узла;
- sibling — указатель на правого брата узла;
- degree — степень узла (количество дочерних узлов данного узла).
Корни деревьев, их которых состоит пирамида, содержатся в так называемом списке корней, при проходе по которому степени соответствующих корней находятся в неубывающем порядке. Доступ к куче осуществляется ссылкой на первый корень в списке корней.
Операции над биномиальными пирамидами
Рассмотрим операции, которые можно производить с биномиальной пирамидой. Их асимптотические оценки показаны в таблице.
makeHeap | |
insert | |
getMinimum | |
extractMin | |
merge | |
decreaseKey | |
delete |
makeHeap
Для создания пустой биномиальной пирамиды процедура makeBinomialHeap просто выделяет память и возвращает объект H, где head[H] = null, то есть пирамида не содержит элементов.
getMinimum
Для нахождения минимального элемента надо найти элемент в списке корней с минимальным значением (предполагается, что ключей, равных
, нет).Асимптотика этой операции получается из того, что корней в этом списке не более
.При вызове этой процедуры для кучи, изображенной на картинке ниже, будет возвращен указатель на вершину с ключем 1.
merge
Эта операция, соединяющая две биномиальные кучи в одну, используется в качестве подпрограммы большинством остальных операций.
Для этого нам надо сначала слить списки корней
в единый связный список, отсортированный по степеням в монотонно возрастающем порядке. Свойство пирамиды обеспечивает нам в новом списке наличие не более двух деревьев одинаковой степени. Далее мы за один проход по этому списку объединим некоторые деревья так, что в результате все они будут иметь попарно разные степени. На каждом шаге нам надо расмотреть несколько случаев.- Рассматриваемое дерево и следующее за ним имеют разные степени (случай a на рисунке). Ситуация тривиальна и не требует никаких действий. Переходим к следующему шагу.
- Текущее дерево и его два ближаших соседа справа (то есть те, которые встретятся на последующих итерациях) имеют одинаковые степени (случай b на рисунке). Эта ситуация хоть и не тривиальна, но ее следует оставить для следующего шага.
- Если степень текущего и последующего деревьев одинакова (случай c-d на рисунке), то нам следует объединить их в новое дерево (сделав корнем вершину того дерева, чей ключ наименьший), степень которого будет на единицу больше той, что была ранее.
Пример пирамиды до merge и после:
insert
Необходимо просто создать биномиальную пирамиду
с одним узлом за время и объединяет ее с биномиальной пирамидой Н, содержащей n узлов, за время .extractMin
Приведенная ниже процедура извлекает узел с минимальным ключом из биномиальной кучи и возвращает указатель на извлеченный узел:
extractMin(H) поиск корня х с минимальным значением ключа в списке корней Н, и удаление х из корней Н H' = Make_Binomial_Heap() Обращение порядка связанного списка дочерних узлов х, установка поля р каждого дочернего узла Н равным NIL присвоение указателю head[H'] адреса заголовка получающегося списка H = Binomial_Heap_Union(H, H') return x
Поскольку минимальный элемент находится в корневом списке, найти его легко; после его удаления соответствующее дерево рассыпается в набор биномиальных деревьев меньшего размера, который надо объединить с оставшейся частью кучи. Все действия выполняются за время
, так что общее время работы процедуры есть .decreaseKey
Следующая процедура уменьшает ключ элемента x биномиальной кучи, присваивая ему новое значение. Вершина, ключ которой был уменьшен, «всплывает» наверх. Процедура выполняется за время
, поскольку глубина вершины x есть (свойства биномиального дерева), а при выполнении каждого шага алгоритма мы поднимаемся вверх.
Binomial_Heap_Decrease_Key(H, x, k)
if k > key[x] then
return
key[x] = k
y = x
z = p[y]
while (z
NIL and key[y] < key[z]) do
swap(key[y], key[z])
y = z
z = p[y]
Пример работы процедуры проиллюстрирован на рисунке (y - уменьшаемый элемент, z - его предок).
delete
Удаление ключа сводится к двум предыдущим операциям: мы уменьшаем ключ до минимально возможного значения, а затем удаляем вершину с минимальным ключом. В процессе выполнения процедуры это значение всплывает вверх, откуда и удаляется. Процедура выполняется за время
.
Binomial_Heap_Delete(H, x)
Binomial_Heap_Decrease_Key(H, x, -
)
Binomial_Heap_Extract_Min(H)
Источники
- INTUIT.ru |Биномиальные кучи
- Wikipedia | Binomial_heap
- Кормен Т., Лейзерсон Ч., Ривест Р. Алгоритмы: построение и анализ. — 2-е изд. — М.: Издательский дом «Вильямс», 2007. — С. 538-558.