Фибоначчиева куча — различия между версиями
(Новая страница: «= Фибоначчиевы деревья = {{Определение |definition= '''Фибоначчиево дерево''' - биномиальное дерево…») |
|||
Строка 32: | Строка 32: | ||
'''Фибоначчиева куча''' - набор фибоначчиевых деревьев. | '''Фибоначчиева куча''' - набор фибоначчиевых деревьев. | ||
}} | }} | ||
+ | |||
+ | Фибоначчиевы кучи являются сливаемыми(mergeable) кучами. | ||
Корни фибоначчиевых деревьев, составляющих фибоначчиеву кучу, также объединены в двусвязный циклический список(корневой список, root list). | Корни фибоначчиевых деревьев, составляющих фибоначчиеву кучу, также объединены в двусвязный циклический список(корневой список, root list). | ||
Строка 37: | Строка 39: | ||
Доступ к куче осуществляется с помощью указателя <tex> min[H] </tex>, указывающего на минимальную вершину в куче. | Доступ к куче осуществляется с помощью указателя <tex> min[H] </tex>, указывающего на минимальную вершину в куче. | ||
− | Доказательство времени работы для всех операций с фибоначчиевыми кучами проводим с помощью амортизационного анализа. | + | Доказательство времени работы для всех операций с фибоначчиевыми кучами проводим с помощью методов амортизационного анализа. |
= Операции = | = Операции = | ||
+ | |||
+ | == Потенциал == | ||
+ | |||
+ | Введем потенциал фибоначчиевой кучи <tex> \Phi(H) </tex>, как количество элементов в корневом списке прибавить удвоенное количество вершин с <tex> mark[x] == true </tex>. На языке метода предоплаты это выглядит следующим образом: возле каждого корня лежит одна монета, а возле каждой вершины, у которой удалили ребенка, лежит две монеты. | ||
+ | |||
+ | == Make_heap == | ||
+ | |||
+ | Создается новый пустой корневой список, в <tex> min[H] </tex> устанавливается значение <tex> null </tex>. Реальное время работы - <tex> O(1) </tex>. | ||
== Merge == | == Merge == | ||
+ | |||
+ | Слияние двух фибоначчиевых куч происходит просто: объединяем списки этих куч в один, релаксируем минимум. Реальное время работы - <tex> O(1) </tex>. Амортизированное время работы - также <tex> O(1) </tex>, поскольку, при объединении двух куч в одну, потенциалы суммируются и не изменяются, <tex> \Phi_{n + 1} - \Phi_n = 0 </tex>. | ||
+ | |||
+ | == Insert == | ||
+ | |||
+ | Вставка элемента в фибоначчиеву кучу также тривиальна: создается новая куча из одного элемента и сливается с текущей. Амортизированная стоимость операции: 1 (создание кучи) + 2 (слияние куч + релаксация минимума) + 1(изменение потенциала) = 4. | ||
+ | |||
+ | == Extract_min == | ||
+ | |||
+ | Первая рассматриваемая операция, в ходе которой меняется структура кучи. Здесь используется вспомогательная процедура Consolidate("уплотнение" кучи). | ||
+ | |||
+ | === Consolidate === | ||
+ | |||
+ | Данная процедура принимает кучу, и делает из нее кучу, в корневом списке которой <tex> O(logN) </tex> вершин. | ||
+ | |||
+ | Для этого возьмем массив списков указателей на корни деревьев <tex> A[0..D[H]] </tex>, где <tex> D[H] </tex> - максимальная степень вершины в текущем корневом списке. |
Версия 23:36, 15 мая 2011
Содержание
Фибоначчиевы деревья
Определение: |
Фибоначчиево дерево - биномиальное дерево, где у каждой вершины удалено не более одного ребенка. |
Лемма: |
Фибоначчиево дерево ранга содержит не менее ( число Фибоначчи) вершин |
Доказательство: |
Для рангов 0 и 1 соответствующие деревья содержат 1 вершину, .Рассмотрим дерево ранга Оно в худшем случае (удален ребенок ранка Эта сумма, в свою очередь, равна ) содержит вершин. |
Поскольку
, где , то высота фибоначчиева дерева есть .Каждая вершина
знает своего родителя ( ) и какого-нибудь своего ребенка( ).Дети любой вершины связаны в циклический двусвязный список. Такие списки удобны по двум причинам: из такого списка можно удалить вершину, и два таких списка можно связать в один за
Также в любой вершине хранятся поля
: степень вершины(число ее детей) и пометка о том, потеряла ли вершина ребенка после того, как она в последний раз сделалась чьим-либо потомком.Фибоначчиевы кучи
Определение: |
Фибоначчиева куча - набор фибоначчиевых деревьев. |
Фибоначчиевы кучи являются сливаемыми(mergeable) кучами.
Корни фибоначчиевых деревьев, составляющих фибоначчиеву кучу, также объединены в двусвязный циклический список(корневой список, root list).
Доступ к куче осуществляется с помощью указателя
, указывающего на минимальную вершину в куче.Доказательство времени работы для всех операций с фибоначчиевыми кучами проводим с помощью методов амортизационного анализа.
Операции
Потенциал
Введем потенциал фибоначчиевой кучи
, как количество элементов в корневом списке прибавить удвоенное количество вершин с . На языке метода предоплаты это выглядит следующим образом: возле каждого корня лежит одна монета, а возле каждой вершины, у которой удалили ребенка, лежит две монеты.Make_heap
Создается новый пустой корневой список, в
устанавливается значение . Реальное время работы - .Merge
Слияние двух фибоначчиевых куч происходит просто: объединяем списки этих куч в один, релаксируем минимум. Реальное время работы -
. Амортизированное время работы - также , поскольку, при объединении двух куч в одну, потенциалы суммируются и не изменяются, .Insert
Вставка элемента в фибоначчиеву кучу также тривиальна: создается новая куча из одного элемента и сливается с текущей. Амортизированная стоимость операции: 1 (создание кучи) + 2 (слияние куч + релаксация минимума) + 1(изменение потенциала) = 4.
Extract_min
Первая рассматриваемая операция, в ходе которой меняется структура кучи. Здесь используется вспомогательная процедура Consolidate("уплотнение" кучи).
Consolidate
Данная процедура принимает кучу, и делает из нее кучу, в корневом списке которой
вершин.Для этого возьмем массив списков указателей на корни деревьев
, где - максимальная степень вершины в текущем корневом списке.