Куча Бродала-Окасаки — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
(Операции)
Строка 24: Строка 24:
 
== Операции ==
 
== Операции ==
 
=== Merge ===
 
=== Merge ===
Слияние выполняется выбором минимума из двух значений <tex>T_{min}</tex> и добавлением в приоритетную очередь второго BPQ.
+
Слияние выполняется выбором минимума из двух значений <tex>T_{min}</tex> и добавлением в приоритетную очередь второго ''BPQ''.
 
<code>
 
<code>
  '''pair(int, bpq)''' merge((x : '''int''', q : '''bpq''') : '''pair''', (y : '''int''', r : '''bpq''') : '''pair'''):
+
  '''pair(int, bpq)''' merge((x:'''int''', q:'''bpq'''):'''pair''', (y:'''int''', r:'''bpq'''):'''pair'''):
 
     '''if''' x < y
 
     '''if''' x < y
 
         '''return''' (x, insert(q, (y, r)))
 
         '''return''' (x, insert(q, (y, r)))
Строка 35: Строка 35:
  
 
=== Insert ===
 
=== Insert ===
Это создание нового BPQ и <math>\mathrm{merge}</math> его с основным деревом.
+
Это создание нового ''BPQ'' и <math>\mathrm{merge}</math> его с основным деревом.
 
<code>
 
<code>
  '''pair(int, bpq)''' insert((x : '''int''', q : '''bpq'''), y : '''bpq'''):
+
  '''pair(int, bpq)''' insert((x:'''int''', q:'''bpq'''):'''pair''', y:'''bpq'''):
     return merge((x,q), create(y))
+
     return merge((x, q), create(y))
 
</code>
 
</code>
 
Создание и <math>\mathrm{merge}</math> выполняются за <tex>O(1)</tex>, тогда <math>\mathrm{insert}</math> работает за <tex>O(1)</tex>.
 
Создание и <math>\mathrm{merge}</math> выполняются за <tex>O(1)</tex>, тогда <math>\mathrm{insert}</math> работает за <tex>O(1)</tex>.
  
 
=== getMin ===
 
=== getMin ===
Выполняется просто, так как BPQ хранит минимум.
+
Выполняется просто, так как ''BPQ'' хранит минимум.
 
<code>
 
<code>
  '''int''' getMin((x : '''int''', q : '''bpq''')):
+
  '''int''' getMin((x:'''int''', q:'''bpq'''):'''pair'''):
 
     return x;
 
     return x;
 
</code>
 
</code>
Строка 51: Строка 51:
  
 
=== extractMin ===
 
=== extractMin ===
Минимальный элемент хранится в верхнем BPQ, по этому его поиск не нужен. Требуется извлечение минимума из приоритетной очереди BPQ'ов.  
+
Минимальный элемент хранится в верхнем ''BPQ'', по этому его поиск не нужен. Требуется извлечение минимума из приоритетной очереди ''BPQ'''ов.  
 
<code>
 
<code>
  '''pair (int, bpq)''' extractMin('''pair'''(x : '''int''', q : '''bpq''')):
+
  '''pair (int, bpq)''' extractMin((x:'''int''', q:'''bpq'''):'''pair'''):
     ((y,r), t) = extractMin(q)
+
     ((y, r), t) = extractMin(q)
 
     '''return''' (y, merge(r, t))
 
     '''return''' (y, merge(r, t))
 
</code>
 
</code>
Здесь <math>\mathrm{extractMin}</math>{{---}} это функция, извлекающая минимальный элемент типа BPQ из приоритетной очереди, она возвращает <tex>(y,r)</tex> {{---}} минимальный элемент типа BPQ и остаток от приоритетной очереди после извлечение минимума {{---}} <tex>t</tex>. <math>\mathrm{merge}</math> функция, выполняющая слияние двух приоритетных очередей.
+
Здесь <math>\mathrm{extractMin}</math>{{---}} это функция, извлекающая минимальный элемент типа ''BPQ'' из приоритетной очереди, она возвращает <tex>(y,r)</tex> {{---}} минимальный элемент типа ''BPQ'' и остаток от приоритетной очереди после извлечение минимума {{---}} <tex>t</tex>. <math>\mathrm{merge}</math> функция, выполняющая слияние двух приоритетных очередей.
  
Возвращаем BPQ, где <tex>y</tex> {{---}} новый минимальный элемент, и <math>\mathrm{merge}</math> приоритетная очередь без элемента <tex>y</tex>.
+
Возвращаем ''BPQ'', где <tex>y</tex> {{---}} новый минимальный элемент, и <math>\mathrm{merge}</math> приоритетная очередь без элемента <tex>y</tex>.
  
 
Так как <math>\mathrm{extractMin}</math> и <math>\mathrm{merge}</math> выполняются за <tex>O(\log N)</tex>, тогда <math>\mathrm{extractMin}</math> выполняется за <tex>O(\log N)</tex>.
 
Так как <math>\mathrm{extractMin}</math> и <math>\mathrm{merge}</math> выполняются за <tex>O(\log N)</tex>, тогда <math>\mathrm{extractMin}</math> выполняется за <tex>O(\log N)</tex>.

Версия 12:08, 11 июня 2014

Куча Бродала-Окасаки (англ. Brodal's and Okasaki's Priority Queue) — основана на использовании биномиальной кучи без каскадных ссылок, что позволяет делать [math]\mathrm{insert}[/math] за [math]O(1)[/math], добавлении минимального элемента, позволяет получать минимальный элемент за [math]O(1)[/math], и идеи Data-structural bootstrapping, позволяющей выполнить [math]\mathrm{merge}[/math] за [math]O(1)[/math]. Удаление минимума работает за [math]O(\log N)[/math] в худшем случае. Эти оценки являются асимптотически оптимальными среди всех основанных на сравнении приоритетных очередей.

Структура

Используем идею, которую Тарьян и Буксбаум называют Data-structural bootstrapping.

Определение:
Data-structural bootstrapping — это идея, позволяющая снизить время [math]\mathrm{merge}[/math] до [math]O(1)[/math] путем разрешения хранить в очереди другую очередь.




Создадим структуру Bootstrapping Priority Queues, которая будет хранить пару из минимального элемента [math]T_{min}[/math] и приоритетную очередь. Элементами приоритетной очереди будут Bootstrapping Priority Queues упорядоченные по [math]T_{min}[/math]. Это можно записать так:

[math] BPQ \left \langle T_{min}, PQ \right \rangle = (T_{min}, PQ \left \langle BPQ \left \langle T_{min}, PQ\right \rangle \right \rangle)[/math]

Куча из одного элемента будет выглядеть так:

[math] \mathrm{create} [/math][math](x) = BPQ \left \langle x, null\right \rangle[/math]

Данная структура не будет бесконечной, так как каждый раз в приоритетной очереди будет храниться на один элемент меньше, таким образом образуя иерархическую структуру. Каждое значение храниться в одном из значений [math]T_{min}.[/math]

Операции

Merge

Слияние выполняется выбором минимума из двух значений [math]T_{min}[/math] и добавлением в приоритетную очередь второго BPQ.

pair(int, bpq) merge((x:int, q:bpq):pair, (y:int, r:bpq):pair):
    if x < y
        return (x, insert(q, (y, r)))
    else
        return (y, insert(r, (x, q)))

Здесь [math]\mathrm{insert}[/math] это добавление в приоритетную очередь работает за [math]O(1)[/math], тогда [math]\mathrm{merge}[/math] работает за [math]O(1)[/math].

Insert

Это создание нового BPQ и [math]\mathrm{merge}[/math] его с основным деревом.

pair(int, bpq) insert((x:int, q:bpq):pair, y:bpq):
    return merge((x, q), create(y))

Создание и [math]\mathrm{merge}[/math] выполняются за [math]O(1)[/math], тогда [math]\mathrm{insert}[/math] работает за [math]O(1)[/math].

getMin

Выполняется просто, так как BPQ хранит минимум.

int getMin((x:int, q:bpq):pair):
    return x;

Очевидно, работает за [math]O(1)[/math].

extractMin

Минимальный элемент хранится в верхнем BPQ, по этому его поиск не нужен. Требуется извлечение минимума из приоритетной очереди BPQ'ов.

pair (int, bpq) extractMin((x:int, q:bpq):pair):
    ((y, r), t) = extractMin(q)
    return (y, merge(r, t))

Здесь [math]\mathrm{extractMin}[/math]— это функция, извлекающая минимальный элемент типа BPQ из приоритетной очереди, она возвращает [math](y,r)[/math] — минимальный элемент типа BPQ и остаток от приоритетной очереди после извлечение минимума — [math]t[/math]. [math]\mathrm{merge}[/math] функция, выполняющая слияние двух приоритетных очередей.

Возвращаем BPQ, где [math]y[/math] — новый минимальный элемент, и [math]\mathrm{merge}[/math] приоритетная очередь без элемента [math]y[/math].

Так как [math]\mathrm{extractMin}[/math] и [math]\mathrm{merge}[/math] выполняются за [math]O(\log N)[/math], тогда [math]\mathrm{extractMin}[/math] выполняется за [math]O(\log N)[/math].

Смотри также

Источники информации