Амортизационная стоимость. Фибоначчиева куча.

Амортизационная стоимость (анализ)

Амортизационный анализ — метод подсчета времени, требуемого для выполнения последовательности операций над структурой данных. При этом время усредняется по всем выполняемым операциям, и анализируется средняя производительность операций в худшем случае.
Такой анализ чаще всего используется, чтобы показать, что даже если некоторые из операций последовательности являются дорогостоящими, то при усреднении по всем операциям средняя их стоимость будет небольшой за счёт низкой частоты встречаемости. Это оценка среднего времени выполнения операций для худшего случая.
Средняя амортизационная стоимость операций — величина Амортизационная стоимость. Фибоначчиева куча. - student2.ru , находящаяся по формуле: Амортизационная стоимость. Фибоначчиева куча. - student2.ru , где Амортизационная стоимость. Фибоначчиева куча. - student2.ru - время выполнения операций Амортизационная стоимость. Фибоначчиева куча. - student2.ru совершённых над структурой данных.
Амортизационный анализ использует следующие методы:
1. Метод усреднения (метод группового анализа).
2. Метод потенциалов.
3. Метод предоплаты (метод бухгалтерского учета).
Метод усреднения
В методе усреднения амортизационная стоимость операций определяется напрямую по формуле, указанной выше: суммарная стоимость всех операций алгоритма делится на их количество.

Пример

Рассмотрим стек с операцией Амортизационная стоимость. Фибоначчиева куча. - student2.ru — извлечение из стека Амортизационная стоимость. Фибоначчиева куча. - student2.ru элементов. В худшем случае она работает за Амортизационная стоимость. Фибоначчиева куча. - student2.ru времени, если удаляются все элементы массива. Однако прежде чем удалить элемент, его нужно добавить в стек. Итак, если в стеке было не более Амортизационная стоимость. Фибоначчиева куча. - student2.ru элементов, то в худшем случае с каждым из них могли быть произведены 2 операции - добавление в стек и извлечение из него. Например, если было Амортизационная стоимость. Фибоначчиева куча. - student2.ru операций Амортизационная стоимость. Фибоначчиева куча. - student2.ru - добавление в стек, стоимость каждой Амортизационная стоимость. Фибоначчиева куча. - student2.ru , и одна операция Амортизационная стоимость. Фибоначчиева куча. - student2.ru , то суммарное время всех операций — Амортизационная стоимость. Фибоначчиева куча. - student2.ru , всего операций Амортизационная стоимость. Фибоначчиева куча. - student2.ru , а значит, амортизационная стоимость операции — Амортизационная стоимость. Фибоначчиева куча. - student2.ru .


Метод предоплаты
Представим, что использование определенного количества времени равносильно использованию определенного количества монет (плата за выполнение каждой операции). В методе предоплаты каждому типу операций присваивается своя учётная стоимость. Эта стоимость может быть больше фактической, в таком случае лишние монеты используются как резерв для выполнения других операций в будущем, а может быть меньше, тогда гарантируется, что текущего накопленного резерва достаточно для выполнения операции.

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

Пример

Опять же рассмотрим стек с операцией Амортизационная стоимость. Фибоначчиева куча. - student2.ru . При выполнении операции Амортизационная стоимость. Фибоначчиева куча. - student2.ru будем использовать две монеты — одну для самой операции, а вторую — в качестве резерва. Тогда для операций Амортизационная стоимость. Фибоначчиева куча. - student2.ru и Амортизационная стоимость. Фибоначчиева куча. - student2.ru учётную стоимость можно принять равной нулю и использовать для удаления элемента монету, оставшуюся после операции Амортизационная стоимость. Фибоначчиева куча. - student2.ru .
Таким образом, для каждой операции требуется Амортизационная стоимость. Фибоначчиева куча. - student2.ru монет, а значит, cредняя амортизационная стоимость операций Амортизационная стоимость. Фибоначчиева куча. - student2.ru .

Метод потенциалов

Обобщение метода предоплаты. Самый точный
Введём для каждого состояния структуры данных величину Амортизационная стоимость. Фибоначчиева куча. - student2.ru — потенциал (функция из множества состояний структуры в действительные числа). Изначально потенциал равен Амортизационная стоимость. Фибоначчиева куча. - student2.ru , а после выполнения Амортизационная стоимость. Фибоначчиева куча. - student2.ru -ой операции — Амортизационная стоимость. Фибоначчиева куча. - student2.ru . Стоимость Амортизационная стоимость. Фибоначчиева куча. - student2.ru -ой операции обозначим Амортизационная стоимость. Фибоначчиева куча. - student2.ru . Если удалось придумать такую Ф, что Ф(Dn)>= Ф(D0), то суммарная учетная стоимость даст верхнюю оценку для реальной стоимости nопераций.

Сумма ai>= сумма ti

Пример

В качестве примера вновь рассмотрим стек с операцией Амортизационная стоимость. Фибоначчиева куча. - student2.ru . Пусть потенциал — это количество элементов в стеке. Тогда:

1.1) Амортизационная стоимость. Фибоначчиева куча. - student2.ru т. к. время выполнения операции Амортизационная стоимость. Фибоначчиева куча. - student2.ru — 1, и изменение потенциала — тоже 1.

1.2) Амортизационная стоимость. Фибоначчиева куча. - student2.ru т. к. время выполнения операции Амортизационная стоимость. Фибоначчиева куча. - student2.ru — 1, а изменение потенциала — -1.

1.3) Амортизационная стоимость. Фибоначчиева куча. - student2.ru т. к. время выполнения операции Амортизационная стоимость. Фибоначчиева куча. - student2.ru — k, а изменение потенциала — -k.

Коль скоро учетная стоимость каждой операции не превосходит 2, стоимость последовательности nопераций, начинающихся с пустого стека – есть O(n).

Фибоначчиева Куча

Фибоначчиево дерево — биномиальное дерево, где у каждой вершины удалено не более одного ребенка.

Порядок фибоначчиева дерева — порядок соответствующего биномиального дерева, из которого оно получено.

Степень вершины — количество дочерних узлов данной вершины.

Фибоначчиева куча — набор фибоначчиевых деревьев, корни которых объединены в неупорядоченный циклический двусвязный список. В отличие от биномиальной кучи, степени корней не обязаны быть попарно различными. Суть дерева в том, что любая операция, которая не требует удаления элемента из кучи, происходит за константу. Удаление же происходит примерно за O(log(n)) Амортизационная стоимость. Фибоначчиева куча. - student2.ru
Пример Фибоначчиево дерева.

Структура

· Каждый узел Амортизационная стоимость. Фибоначчиева куча. - student2.ru в куче Амортизационная стоимость. Фибоначчиева куча. - student2.ru содержит следующие указатели и поля: Амортизационная стоимость. Фибоначчиева куча. - student2.ru — поле, в котором хранится ключ; Амортизационная стоимость. Фибоначчиева куча. - student2.ru — указатель на родительский узел; Амортизационная стоимость. Фибоначчиева куча. - student2.ru — указатель на один из дочерних узлов (левый); Амортизационная стоимость. Фибоначчиева куча. - student2.ru — указатель на левый сестринский узел; Амортизационная стоимость. Фибоначчиева куча. - student2.ru — указатель на правый сестринский узел; Амортизационная стоимость. Фибоначчиева куча. - student2.ru — поле, в котором хранится количество дочерних узлов; Амортизационная стоимость. Фибоначчиева куча. - student2.ru — логическое значение, которое показывает, удаляли ли мы дочерние узлы данной вершины.

· Дочерние узлы Амортизационная стоимость. Фибоначчиева куча. - student2.ru объединены при помощи указателей Амортизационная стоимость. Фибоначчиева куча. - student2.ru и Амортизационная стоимость. Фибоначчиева куча. - student2.ru в циклический двусвязный список.

· Корни всех деревьев в Амортизационная стоимость. Фибоначчиева куча. - student2.ru связаны при помощи указателей Амортизационная стоимость. Фибоначчиева куча. - student2.ru и Амортизационная стоимость. Фибоначчиева куча. - student2.ru в циклический двусвязный список корней.

· Порядок узлов – любой (в циклическом списке)

· Обращение к Амортизационная стоимость. Фибоначчиева куча. - student2.ru выполняется посредством указателя Амортизационная стоимость. Фибоначчиева куча. - student2.ru на корень дерева с минимальным ключом. Этот узел называется минимальным узлом Амортизационная стоимость. Фибоначчиева куча. - student2.ru .

· Текущее количество узлов в Амортизационная стоимость. Фибоначчиева куча. - student2.ru хранится в Амортизационная стоимость. Фибоначчиева куча. - student2.ru .

· Максимальная степень Амортизационная стоимость. Фибоначчиева куча. - student2.ru произвольной вершины в фибоначчиевой куче с Амортизационная стоимость. Фибоначчиева куча. - student2.ru вершинами равна Амортизационная стоимость. Фибоначчиева куча. - student2.ru

Циклический двусвязный список обладает двумя преимуществами для использования в фибоначчиевых кучах. Во-первых, удаление элемента из такого списка выполняется за время Амортизационная стоимость. Фибоначчиева куча. - student2.ru . Во-вторых, если имеется два таких списка, их легко объединить в один за время Амортизационная стоимость. Фибоначчиева куча. - student2.ru
Вводим потенциал:

Ф(Н) = t(H) + 2m(H) , где t(H) – число деревьев в корневом списке кучи, а m(H) – количество отмеченных вершин (mark ==true)

Ф(H) >= 0 è удовлетворяет условию использования потенциала. Если H – пустая куча, то == 0


Основные операции:

операция Ci - реальная стоимость Фi – Ф(i-1)
Амортизационная стоимость. Фибоначчиева куча. - student2.ru Амортизационная стоимость. Фибоначчиева куча. - student2.ru
Амортизационная стоимость. Фибоначчиева куча. - student2.ru Амортизационная стоимость. Фибоначчиева куча. - student2.ru
Амортизационная стоимость. Фибоначчиева куча. - student2.ru Амортизационная стоимость. Фибоначчиева куча. - student2.ru
Амортизационная стоимость. Фибоначчиева куча. - student2.ru Амортизационная стоимость. Фибоначчиева куча. - student2.ru
Амортизационная стоимость. Фибоначчиева куча. - student2.ru Амортизационная стоимость. Фибоначчиева куча. - student2.ru D(n)+1+2m(H)
Амортизационная стоимость. Фибоначчиева куча. - student2.ru Амортизационная стоимость. Фибоначчиева куча. - student2.ru  
Амортизационная стоимость. Фибоначчиева куча. - student2.ru Амортизационная стоимость. Фибоначчиева куча. - student2.ru  

MakeHeap

Создается новый пустой корневой список, в Амортизационная стоимость. Фибоначчиева куча. - student2.ru устанавливается значение Амортизационная стоимость. Фибоначчиева куча. - student2.ru . Реальное время работы — Амортизационная стоимость. Фибоначчиева куча. - student2.ru .
insert
Вставка элемента в фибоначчиеву кучу также тривиальна: создается новая куча из одного элемента и сливается с текущей. Реальное время работы составляет Амортизационная стоимость. Фибоначчиева куча. - student2.ru .

GetMin

Возвращает указатель Амортизационная стоимость. Фибоначчиева куча. - student2.ru . Реальное время работы — Амортизационная стоимость. Фибоначчиева куча. - student2.ru .

Merge

Слияние двух фибоначчиевых куч происходит просто: объединяем списки этих куч в один, релаксируем минимум. Реальное время работы — Амортизационная стоимость. Фибоначчиева куча. - student2.ru .

Ф(H) – (Ф(Н1) + Ф(Н2)) = t(H) – t(H1) – t(H2) + 2(m(H) – m(H1) – m(H2)) = 0

ExtractMin

Первая рассматриваемая операция, в ходе которой меняется структура кучи. Здесь используется вспомогательная процедура Амортизационная стоимость. Фибоначчиева куча. - student2.ru . Возьмем указатель на Амортизационная стоимость. Фибоначчиева куча. - student2.ru , удалим эту вершину. Ее поддеревья (их не более, чем Амортизационная стоимость. Фибоначчиева куча. - student2.ru , где Амортизационная стоимость. Фибоначчиева куча. - student2.ru — максимальная степень вершины в куче) объединим с корневым списком. Теперь вызываем процедуру Амортизационная стоимость. Фибоначчиева куча. - student2.ru . После этой операции в списке корней остается не более чем Амортизационная стоимость. Фибоначчиева куча. - student2.ru узлов, среди которых нужно найти минимальный.

z = min(H)

if (z != null)

then

for каждый ребенок x вершины z

do добавить x в корневой список H

p[x] = null

удалить z из корневого списка H

if (z == right[z])

then min(H) = null

else

min(H) = right[z]

Consolidate(H)

Returnz;

Consolidate

Данная процедура принимает кучу и преобразует ее таким образом, что в корневом списке остается не более Амортизационная стоимость. Фибоначчиева куча. - student2.ru вершин.

Для этого возьмем массив списков указателей на корни деревьев Амортизационная стоимость. Фибоначчиева куча. - student2.ru , где Амортизационная стоимость. Фибоначчиева куча. - student2.ru — максимальная степень вершины в текущем корневом списке.

Затем происходит процесс, аналогичный слиянию биномиальных куч: добавляем поочередно каждый корень, смотря на его степень. Пусть она равна Амортизационная стоимость. Фибоначчиева куча. - student2.ru . Если в соответствующей ячейке Амортизационная стоимость. Фибоначчиева куча. - student2.ru еще нету вершины, записываем текущую вершину туда. Иначе подвешиваем одно дерево к другому, и пытаемся также добавить дерево, степень корня которого уже равна Амортизационная стоимость. Фибоначчиева куча. - student2.ru . Продолжаем, пока не найдем свободную ячейку.Когда подсоединяем x к y, убираем пометку с x

Учетная стоимость Амортизационная стоимость. Фибоначчиева куча. - student2.ru равна Амортизационная стоимость. Фибоначчиева куча. - student2.ru .

Иначе говоря:

Еслиx->degree =d

Если A[d] == null, то A[d] = x

Иначе, если A[d] == y, то z = Link(x,y) – y станет сыном x, A[d] == null, аналогично далее. Когда подсоединяем x к y, убираем пометку с x

Учетная стоимость Амортизационная стоимость. Фибоначчиева куча. - student2.ru равна Амортизационная стоимость. Фибоначчиева куча. - student2.ru . Докажем это вместе с ExtractMin:

Нужно O(D(n)) действий, чтобы поместить детей удаляемой вершины в корень. Затем начальный и конечный этапы consolidate (создать массив Aи, находя минимум, поместить деревья в корень) тоже за O(D(n)). Остальная часть consolidate – за O(D(n)) + O(число вызовов Link). Но при каждом вызове Link – длина корневого списка уменьшается на 1, а число отмеченных вершин может только уменьшиться. Так что умножим потенциал на подходящую константу общая сложность – O(D(n))

DecreaseKey

Основная идея: хотим, чтобы учетная стоимость данной операции была Амортизационная стоимость. Фибоначчиева куча. - student2.ru . Было бы хорошо, чтобы вершина не всплывала до корня, и тогда дерево не придется сильно перестраивать. Для этого при удобном случае будем вырезать поддерево полностью и перемещать его в корневой список. Итак, сам алгоритм:

1. Проверяем, если новое значение ключа все же не меньше значения ключа родителя, то все хорошо, и мы выходим.

2. Иначе, вырезаем дерево с текущей вершиной в корневой список, и производим каскадное вырезание родителя.

If (k > key[x])

Error

Key[x] = k

y = p[x]

if (y != null && key[x] < key[y])

cut(H,x,y)

CascadingCut(H,y)

If (key[x] <key[min(H)])

Min(H) = x

Cut

При вырезании вершины мы удаляем ее из списка детей своего родителя, уменьшаем степень ее родителя ( Амортизационная стоимость. Фибоначчиева куча. - student2.ru ), добавляем вершину в корневой список H и снимаем пометку с текущей вершины ( Амортизационная стоимость. Фибоначчиева куча. - student2.ru ).

CascadingCut

Перед вызовом каскадного вырезания нам известно, удаляли ли ребенка у этой вершины. Если у вершины до этого не удаляли дочерний узел ( Амортизационная стоимость. Фибоначчиева куча. - student2.ru ), то мы помечаем эту вершину ( Амортизационная стоимость. Фибоначчиева куча. - student2.ru ) и прекращаем выполнение операции. В противном случае применяем операцию Амортизационная стоимость. Фибоначчиева куча. - student2.ru для текущей вершины и запускаем каскадное вырезание от родителя – для поддержки инварианта из определения фибоначчиева дерева

z = p[y]

if (z != null)

if (mark[y] == false)

mark[y] = true

else

cut(H,y,z)

CascadingCut(H,z)

Время работы

Докажем, что амортизированное время работы операции Амортизационная стоимость. Фибоначчиева куча. - student2.ru есть Амортизационная стоимость. Фибоначчиева куча. - student2.ru . Поскольку в процедуре нет циклов, ее время работы определяется лишь количеством рекурсивных вызовов каскадного вырезания.

Пусть мы вызвали процедуру каскадного вырезания Амортизационная стоимость. Фибоначчиева куча. - student2.ru раз. Так как реальное время работы операции Амортизационная стоимость. Фибоначчиева куча. - student2.ru без учета рекурсии составляет Амортизационная стоимость. Фибоначчиева куча. - student2.ru , то реальное время работы операции Амортизационная стоимость. Фибоначчиева куча. - student2.ruАмортизационная стоимость. Фибоначчиева куча. - student2.ru .

Рассмотрим, как изменится потенциал в результате выполнения данной операции. Пусть Амортизационная стоимость. Фибоначчиева куча. - student2.ru — фибоначчиева куча до вызова Амортизационная стоимость. Фибоначчиева куча. - student2.ru . Тогда после Амортизационная стоимость. Фибоначчиева куча. - student2.ru рекурсивных вызовов операции Амортизационная стоимость. Фибоначчиева куча. - student2.ru вершин с пометкой Амортизационная стоимость. Фибоначчиева куча. - student2.ru стало как минимум на Амортизационная стоимость. Фибоначчиева куча. - student2.ru меньше, потому что каждый вызов каскадного вырезания, за исключением последнего, уменьшает количество помеченных вершин на одну, и в результате последнего вызова одну вершину мы можем пометить. В корневом списке прибавилось Амортизационная стоимость. Фибоначчиева куча. - student2.ru новых деревьев ( Амортизационная стоимость. Фибоначчиева куча. - student2.ru дерево за счет каскадного вырезания и еще одно из-за самого первого вызова операции Амортизационная стоимость. Фибоначчиева куча. - student2.ru ).

В итоге, изменение потенциала составляет: Амортизационная стоимость. Фибоначчиева куча. - student2.ru . Следовательно, амортизированная стоимость не превышает Амортизационная стоимость. Фибоначчиева куча. - student2.ru . Но поскольку мы можем соответствующим образом масштабировать единицы потенциала, то амортизированная стоимость операции Амортизационная стоимость. Фибоначчиева куча. - student2.ru равна Амортизационная стоимость. Фибоначчиева куча. - student2.ru .

Delete

Удаление вершины реализуется через уменьшение ее ключа до Амортизационная стоимость. Фибоначчиева куча. - student2.ru и последующим извлечением минимума. Амортизированное время работы: Амортизационная стоимость. Фибоначчиева куча. - student2.ru .

Поскольку ранее мы показали, что Амортизационная стоимость. Фибоначчиева куча. - student2.ru , то соответствующие оценки доказаны.

Лемма:
Для всех целых Амортизационная стоимость. Фибоначчиева куча. - student2.ru Амортизационная стоимость. Фибоначчиева куча. - student2.ru , где Амортизационная стоимость. Фибоначчиева куча. - student2.ruАмортизационная стоимость. Фибоначчиева куча. - student2.ru -ое число Фибоначчи, определяемое формулой: Амортизационная стоимость. Фибоначчиева куча. - student2.ru
Доказательство:
Докажем лемму по индукции: при Амортизационная стоимость. Фибоначчиева куча. - student2.ru Амортизационная стоимость. Фибоначчиева куча. - student2.ru , что действительно верно. По индукции предполагаем, что Амортизационная стоимость. Фибоначчиева куча. - student2.ru . Тогда Амортизационная стоимость. Фибоначчиева куча. - student2.ru Амортизационная стоимость. Фибоначчиева куча. - student2.ru
Лемма:
Фибоначчиево дерево порядка Амортизационная стоимость. Фибоначчиева куча. - student2.ru содержит не менее Амортизационная стоимость. Фибоначчиева куча. - student2.ru вершин.
Доказательство:
Докажем это утверждение по индукции. Пусть Амортизационная стоимость. Фибоначчиева куча. - student2.ru — минимальный размер фибоначчиева дерева порядка n. При Амортизационная стоимость. Фибоначчиева куча. - student2.ru Амортизационная стоимость. Фибоначчиева куча. - student2.ru . При Амортизационная стоимость. Фибоначчиева куча. - student2.ru Амортизационная стоимость. Фибоначчиева куча. - student2.ru . (Можем удалить 1 ребенка) Предположим по индукции, что для всех Амортизационная стоимость. Фибоначчиева куча. - student2.ru . Пусть в нашем дереве удалено поддерево порядка Амортизационная стоимость. Фибоначчиева куча. - student2.ru (худший). Тогда Амортизационная стоимость. Фибоначчиева куча. - student2.ru Но по предыдущей лемме Амортизационная стоимость. Фибоначчиева куча. - student2.ru . Следовательно, Амортизационная стоимость. Фибоначчиева куча. - student2.ru Амортизационная стоимость. Фибоначчиева куча. - student2.ru
Лемма:
Максимальная степень Амортизационная стоимость. Фибоначчиева куча. - student2.ru произвольной вершины в фибоначчиевой куче с Амортизационная стоимость. Фибоначчиева куча. - student2.ru вершинами равна Амортизационная стоимость. Фибоначчиева куча. - student2.ru
Доказательство:
Пусть Амортизационная стоимость. Фибоначчиева куча. - student2.ru — произвольная вершина в фибоначчиевой куче с Амортизационная стоимость. Фибоначчиева куча. - student2.ru вершинами, и пусть Амортизационная стоимость. Фибоначчиева куча. - student2.ru — степень вершины Амортизационная стоимость. Фибоначчиева куча. - student2.ru . Тогда по доказанному выше в дереве, корень которого Амортизационная стоимость. Фибоначчиева куча. - student2.ru , содержится не менее Амортизационная стоимость. Фибоначчиева куча. - student2.ru вершин, что в свою очередь по лемме равно Амортизационная стоимость. Фибоначчиева куча. - student2.ru - доказывалось на лекции как очевидное Амортизационная стоимость. Фибоначчиева куча. - student2.ru . То есть Амортизационная стоимость. Фибоначчиева куча. - student2.ru (выполнено для поддерева ведь, значит это верно) Логарифмируя по основанию Амортизационная стоимость. Фибоначчиева куча. - student2.ru , получаем Амортизационная стоимость. Фибоначчиева куча. - student2.ru Таким образом, максимальная степень Амортизационная стоимость. Фибоначчиева куча. - student2.ru произвольной вершины равна Амортизационная стоимость. Фибоначчиева куча. - student2.ru . Амортизационная стоимость. Фибоначчиева куча. - student2.ru

Наши рекомендации