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

Материал из Викиконспекты
Перейти к: навигация, поиск
Строка 1: Строка 1:
'''''Куча Бродала-Окасаки''''' - основана на использовании персистентных приоритетных очередей. Поддерживает поиск минимума, вставку, слияние за <tex>O(1)</tex> в худшем случае и удаление минимума за <tex>O(log N)</tex> в худшем случае. Эти оценки являются асимптотически оптимальными среди всех основанных на сравнении приоритетных очередей.
+
'''''Куча Бродала-Окасаки''''' (англ. ''Brodal's and Okasaki's Functional Priority Queue'') - основана на использовании персистентных приоритетных очередей. Поддерживает поиск минимума, вставку, слияние за <tex>O(1)</tex> в худшем случае и удаление минимума за <tex>O(log N)</tex> в худшем случае. Эти оценки являются асимптотически оптимальными среди всех основанных на сравнении приоритетных очередей.
  
 
== Структура ==
 
== Структура ==
Используем структуру, которую Тарьян называет Bootstrapped. Она будет хранить пару из минимального элемента <tex>T_{min}</tex> и приоритетную очередь Bootstrapped'опов упорядоченную по минимальному элементу. Это можно записать так:
+
Используем структуру, которую Тарьян называет Bootstrapped. Она будет хранить пару из минимального элемента <tex>T_{min}</tex> и приоритетную очередь Bootstrapped'ов упорядоченную по минимальному элементу. Это можно записать так:
  
 
<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>
Строка 10: Строка 10:
 
<tex>create(x) = BPQ<x, null></tex>
 
<tex>create(x) = BPQ<x, null></tex>
  
Данная структура не будет бесконечной, так как каждый раз в приоритетной очереди будет храниться на один элемент меньше, таким образом образуя иерархическую структуру, где каждое значение будет храниться где-то в одном из значений <tex>T_{min}</tex>.
+
Данная структура не будет бесконечной, так как каждый раз в приоритетной очереди будет храниться на один элемент меньше, таким образом образуя иерархическую структуру. Каждое значение храниться в одном из значений <tex>T_{min}</tex>.
  
 
== Операции ==
 
== Операции ==
 
=== Merge ===
 
=== Merge ===
Слияние возможно выполнить за <tex>O(1)</tex> за счет того, что второй элемент пары это приоритетная очередь, элементами которой являются Bootstrapped.
+
Слияние выполняется выбором минимума из двух значений <tex>T_{min}</tex> и добавлением в приоритетную очередь второго Bootstrapped.
 
<pre>
 
<pre>
 
merge((x,q), (y,r))
 
merge((x,q), (y,r))
Строка 30: Строка 30:
 
</pre>
 
</pre>
 
Создание и <tex>merge</tex> выполняются за <tex>O(1)</tex>, тогда <tex>insert</tex> работает за <tex>O(1)</tex>.
 
Создание и <tex>merge</tex> выполняются за <tex>O(1)</tex>, тогда <tex>insert</tex> работает за <tex>O(1)</tex>.
=== Find Min ===
+
=== getMinimum ===
 
Выполняется просто, так как Bootstrapped хранит минимум.
 
Выполняется просто, так как Bootstrapped хранит минимум.
 
<pre>
 
<pre>
findMin((x,q))
+
getMinimum((x,q))
 
   return x;
 
   return x;
 
</pre>
 
</pre>
=== Delete Min ===
+
=== extractMinimum ===
Минимальный элемент хранится в верхнем Bootstrapped, по этому его поиск не нужен. Требуется извлечение минимума из приоритетной очереди Bootstrapped'пов.  
+
Минимальный элемент хранится в верхнем Bootstrapped, по этому его поиск не нужен. Требуется извлечение минимума из приоритетной очереди Bootstrapped'ов.  
 
<pre>
 
<pre>
deleteMin((x,q))
+
extractMinimum((x,q))
 
   ((y,r), t) = extractMin(q)
 
   ((y,r), t) = extractMin(q)
 
   return (y, merge(r, t))
 
   return (y, merge(r, t))
 
</pre>
 
</pre>
Здесь <tex>extractMin</tex> это извлечение минимума из приоритетной очереди, она вернет <tex>(y,r)</tex> {{---}} минимальный элемент типа Bootstrapped и остаток от приоритетной очереди после извлечение минимума {{---}} <tex>t</tex>. <tex>merge</tex> - слияние двух приоритетных очередей.
+
Здесь <tex>extractMinimum</tex> {{---}} это функция, извлекающая - минимальный элемент типа Bootstrapped - из приоритетной очереди, она возвращает <tex>(y,r)</tex> - минимальный элемент типа Bootstrapped и остаток от приоритетной очереди после извлечение минимума - <tex>t</tex>. <tex>merge</tex> {{---}} функция, выполняющая слияние двух приоритетных очередей.
  
 
Возвращаем Bootstrapped, где <tex>y</tex> {{---}} новый минимальный элемент, и <tex>merge(r, t)</tex> приоритетная очередь без элемента <tex>y</tex>.
 
Возвращаем Bootstrapped, где <tex>y</tex> {{---}} новый минимальный элемент, и <tex>merge(r, t)</tex> приоритетная очередь без элемента <tex>y</tex>.
  
Здесь <tex>extractMin</tex> и <tex>merge</tex> выполняются за <tex>O(log N)</tex>, тогда <tex>deleteMin</tex> выполняется за <tex>O(log N)</tex>.
+
Так как <tex>extractMin</tex> и <tex>merge</tex> выполняются за <tex>O(log N)</tex>, тогда <tex>extractMinimum</tex> выполняется за <tex>O(log N)</tex>.
 
== Смотри также ==
 
== Смотри также ==
 
* [[Биномиальная куча]]
 
* [[Биномиальная куча]]

Версия 01:32, 9 июня 2013

Куча Бродала-Окасаки (англ. Brodal's and Okasaki's Functional Priority Queue) - основана на использовании персистентных приоритетных очередей. Поддерживает поиск минимума, вставку, слияние за [math]O(1)[/math] в худшем случае и удаление минимума за [math]O(log N)[/math] в худшем случае. Эти оценки являются асимптотически оптимальными среди всех основанных на сравнении приоритетных очередей.

Структура

Используем структуру, которую Тарьян называет Bootstrapped. Она будет хранить пару из минимального элемента [math]T_{min}[/math] и приоритетную очередь Bootstrapped'ов упорядоченную по минимальному элементу. Это можно записать так:

[math] BPQ\lt T_{min}, PQ\gt = (T_{min}, PQ\lt BPQ\lt T_{min}, PQ\gt \gt )[/math]

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

[math]create(x) = BPQ\lt x, null\gt [/math]

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

Операции

Merge

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

merge((x,q), (y,r))
  if x<y
    return (x, insert(q, (y,r)))
  else
    return (y, insert(r, (x,q)))

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

Insert

Это создание нового Bootstrapped и [math]merge[/math] его с основным деревом.

insert((x,q), y)
  return merge((x,q), create(y))

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

getMinimum

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

getMinimum((x,q))
  return x;

extractMinimum

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

extractMinimum((x,q))
  ((y,r), t) = extractMin(q)
  return (y, merge(r, t))

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

Возвращаем Bootstrapped, где [math]y[/math] — новый минимальный элемент, и [math]merge(r, t)[/math] приоритетная очередь без элемента [math]y[/math].

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

Смотри также

Ссылки

Лекция А.С. Станкевича по приоритетным очередям

Optimal Purely Functional Priority Queues