Куча Бродала-Окасаки — различия между версиями
Kris (обсуждение | вклад) (→getMinimum) |
Kris (обсуждение | вклад) (→Структура) |
||
Строка 3: | Строка 3: | ||
== Структура == | == Структура == | ||
== Структура == | == Структура == | ||
− | Используем технику, которую Тарьян называет | + | Используем технику, которую Тарьян называет Bootstrapping. |
{{Определение | {{Определение | ||
|neat = 0 | |neat = 0 | ||
− | |definition= | + | |definition= Bootstrapping - это техника, позволяющая снизить время <tex>merge</tex> до <tex>O(1)</tex> путем разрешения хранить в очереди другую очередь. |
}} | }} | ||
Строка 14: | Строка 14: | ||
− | + | Создадим структуру Bootstrapping Priority Queues, которая будет хранить пару из минимального элемента <tex>T_{min}</tex> и приоритетную очередь. Элементами приоритетной очереди будут Bootstrapping Priority Queues упорядоченные по <tex>T_{min}</tex>. Это можно записать так: | |
<tex> BPQ<T_{min}, PQ> = (T_{min}, PQ<BPQ<T_{min}, PQ>>)</tex> | <tex> BPQ<T_{min}, PQ> = (T_{min}, PQ<BPQ<T_{min}, PQ>>)</tex> | ||
Строка 23: | Строка 23: | ||
Данная структура не будет бесконечной, так как каждый раз в приоритетной очереди будет храниться на один элемент меньше, таким образом образуя иерархическую структуру. Каждое значение храниться в одном из значений <tex>T_{min}</tex>. | Данная структура не будет бесконечной, так как каждый раз в приоритетной очереди будет храниться на один элемент меньше, таким образом образуя иерархическую структуру. Каждое значение храниться в одном из значений <tex>T_{min}</tex>. | ||
+ | |||
== Операции == | == Операции == | ||
=== Merge === | === Merge === |
Версия 05:28, 11 июня 2013
Куча Бродала-Окасаки (англ. Brodal's and Okasaki's Priority Queue) - основана на использовании персистентных приоритетных очередей. Поддерживает поиск минимума, вставку, слияние за в худшем случае и удаление минимума за в худшем случае. Эти оценки являются асимптотически оптимальными среди всех основанных на сравнении приоритетных очередей.
Содержание
Структура
Структура
Используем технику, которую Тарьян называет Bootstrapping.
Создадим структуру Bootstrapping Priority Queues, которая будет хранить пару из минимального элемента
и приоритетную очередь. Элементами приоритетной очереди будут Bootstrapping Priority Queues упорядоченные по . Это можно записать так:
Куча из одного элемента будет выглядеть так
Данная структура не будет бесконечной, так как каждый раз в приоритетной очереди будет храниться на один элемент меньше, таким образом образуя иерархическую структуру. Каждое значение храниться в одном из значений
.Операции
Merge
Слияние выполняется выбором минимума из двух значений
и добавлением в приоритетную очередь второго Bootstrapping.merge((x,q), (y,r)) if x<y return (x, insert(q, (y,r))) else return (y, insert(r, (x,q)))
Здесь
это добавление в приоритетную очередь работает за , тогда работает за .Insert
Это создание нового Bootstrapping и
его с основным деревом.insert((x,q), y) return merge((x,q), create(y))
Создание и
выполняются за , тогда работает за .getMin
Выполняется просто, так как Bootstrapping хранит минимум.
getMin((x,q)) return x;
extractMin
Минимальный элемент хранится в верхнем Bootstrapping, по этому его поиск не нужен. Требуется извлечение минимума из приоритетной очереди Bootstrapping'ов.
extractMin((x,q)) ((y,r), t) = extractMin(q) return (y, merge(r, t))
Здесь
— это функция, извлекающая - минимальный элемент типа Bootstrapping - из приоритетной очереди, она возвращает - минимальный элемент типа Bootstrapping и остаток от приоритетной очереди после извлечение минимума - . — функция, выполняющая слияние двух приоритетных очередей.Возвращаем Bootstrapping, где
— новый минимальный элемент, и приоритетная очередь без элемента .Так как
и выполняются за , тогда выполняется за .