Покажем, что основные операции с кучей Фибоначчи могут быть реализованы в виде последовательности двух процедур: link(i, j) и cut(i).

Для кучи Фибоначчи определим основные операции и покажем, что для реализации каждой из них достаточно использования последовательности процедур link и cut.

Восстановление инварианта 2

Для восстановления инварианта 2 будем хранить для каждого узла i дополнительный индекс lost(i), который определим следующим образом:

Начальная процедура cut может породить другие процедуры cut, которые назовем порожденными процедурами cut. Узлы к которым применяется операция cut будем хранить в списке list.

Восстановление инварианта 2 осуществляется следующим образом: если значение lost(i) = 2, то к узлу i применим процедуру cut(i). В свою очередь процедура cut(i) может породить процедуру cut(pred(i)) для узла k = pred(i), если lost(k) = 2 и т.д. до тех пор, пока не будет выполнен инвариант 2. Узлы, к которым применены начальная процедура cut, и последовательность порожденных процедур cut, а также их ранги сохраняем в списке list.

Восстановление инварианта 3

Инвариант 3 требует, чтобы никаких два корневых узла не имели одинакового ранга. Для поддержки инварианта 3 вводим индекс bucket(k):

Начальная процедура link может породить последовательность других процедур link, которые назовем порожденными процедурами link.

Предположим, что, работая с кучей Фибоначчи, мы создали корень j ранга k и куча содержит другой корневой узел i этого же ранга k. Тогда мы повторяем следующую процедуру для поддержки инварианта 3: выполняется процедура link(i, j), которая объединяет два корневых дерева с корневыми узлами ранга k в новое корневое дерево с корнем ранга k + 1. Пусть l – корень нового дерева. Если bucket(k + 1) = t <> 0, то среди набора корневых деревьев имеется корневое дерево с корнем t ранга k + 1. Выполняем снова процедуру link(l, t) объеденения двух корневых деревьев с корнями ранга k + 1 в одно корневое дерево с корнем ранга k + 2 и снова проверяем значение bucket(k + 2) и т.д. Этот процесс выполнения процедур link продолжается до тех пор, пока не будет сохранен инвариант 3. После выполнения каждой процедуры link(i, j) необходимо корректировать элементы структуры данных.

Hosted by uCoz