<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=94.25.229.57&amp;*</id>
		<title>Викиконспекты - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=94.25.229.57&amp;*"/>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/94.25.229.57"/>
		<updated>2026-05-05T19:38:28Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D1%83%D1%87%D0%B0_%D0%91%D1%80%D0%BE%D0%B4%D0%B0%D0%BB%D0%B0-%D0%9E%D0%BA%D0%B0%D1%81%D0%B0%D0%BA%D0%B8&amp;diff=31746</id>
		<title>Куча Бродала-Окасаки</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D1%83%D1%87%D0%B0_%D0%91%D1%80%D0%BE%D0%B4%D0%B0%D0%BB%D0%B0-%D0%9E%D0%BA%D0%B0%D1%81%D0%B0%D0%BA%D0%B8&amp;diff=31746"/>
				<updated>2013-06-11T08:51:06Z</updated>
		
		<summary type="html">&lt;p&gt;94.25.229.57: /* getMin */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Куча Бродала-Окасаки''' (англ. ''Brodal's and Okasaki's Priority Queue'') - основана на использовании [[Биномиальная куча|биномиальной кучи]] без каскадных ссылок, что позволяет делать &amp;lt;tex&amp;gt;insert&amp;lt;/tex&amp;gt; за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;, добавлении минимального элемента, позволяет получать минимальный элемент за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;, и идеи Data-structural bootstrapping, позволяющей выполнить &amp;lt;tex&amp;gt;merge&amp;lt;/tex&amp;gt; за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;. Удаление минимума работает за &amp;lt;tex&amp;gt;O(log N)&amp;lt;/tex&amp;gt; в худшем случае. Эти оценки являются асимптотически оптимальными среди всех основанных на сравнении приоритетных очередей.&lt;br /&gt;
&lt;br /&gt;
== Структура ==&lt;br /&gt;
Используем идею, которую Тарьян и Буксбаум называют Data-structural bootstrapping. &lt;br /&gt;
{{Определение&lt;br /&gt;
|neat = 0&lt;br /&gt;
|definition= Data-structural bootstrapping - это идея, позволяющая снизить время &amp;lt;tex&amp;gt;merge&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt; путем разрешения хранить в очереди другую очередь.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Создадим структуру Bootstrapping Priority Queues, которая будет хранить пару из минимального элемента &amp;lt;tex&amp;gt;T_{min}&amp;lt;/tex&amp;gt; и приоритетную очередь. Элементами приоритетной очереди будут Bootstrapping Priority Queues упорядоченные по &amp;lt;tex&amp;gt;T_{min}&amp;lt;/tex&amp;gt;. Это можно записать так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; BPQ&amp;lt;T_{min}, PQ&amp;gt; = (T_{min}, PQ&amp;lt;BPQ&amp;lt;T_{min}, PQ&amp;gt;&amp;gt;)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Куча из одного элемента будет выглядеть так&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;create(x) = BPQ&amp;lt;x, null&amp;gt;&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Данная структура не будет бесконечной, так как каждый раз в приоритетной очереди будет храниться на один элемент меньше, таким образом образуя иерархическую структуру. Каждое значение храниться в одном из значений &amp;lt;tex&amp;gt;T_{min}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Операции ==&lt;br /&gt;
=== Merge ===&lt;br /&gt;
Слияние выполняется выбором минимума из двух значений &amp;lt;tex&amp;gt;T_{min}&amp;lt;/tex&amp;gt; и добавлением в приоритетную очередь второго BPQ.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
merge((x,q), (y,r))&lt;br /&gt;
  if x&amp;lt;y&lt;br /&gt;
    return (x, insert(q, (y,r)))&lt;br /&gt;
  else&lt;br /&gt;
    return (y, insert(r, (x,q)))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Здесь &amp;lt;tex&amp;gt;insert&amp;lt;/tex&amp;gt; это добавление в приоритетную очередь работает за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;merge&amp;lt;/tex&amp;gt; работает за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
=== Insert ===&lt;br /&gt;
Это создание нового BPQ и &amp;lt;tex&amp;gt;merge&amp;lt;/tex&amp;gt; его с основным деревом.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
insert((x,q), y)&lt;br /&gt;
  return merge((x,q), create(y))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Создание и &amp;lt;tex&amp;gt;merge&amp;lt;/tex&amp;gt; выполняются за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;insert&amp;lt;/tex&amp;gt; работает за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
=== getMin ===&lt;br /&gt;
Выполняется просто, так как BPQ хранит минимум.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
getMin((x,q))&lt;br /&gt;
  return x;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Очевидно, работает за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== extractMin ===&lt;br /&gt;
Минимальный элемент хранится в верхнем BPQ, по этому его поиск не нужен. Требуется извлечение минимума из приоритетной очереди BPQ'ов. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
extractMin((x,q))&lt;br /&gt;
  ((y,r), t) = extractMin(q)&lt;br /&gt;
  return (y, merge(r, t))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Здесь &amp;lt;tex&amp;gt;extractMin(q)&amp;lt;/tex&amp;gt; {{---}} это функция, извлекающая минимальный элемент типа BPQ из приоритетной очереди, она возвращает &amp;lt;tex&amp;gt;(y,r)&amp;lt;/tex&amp;gt; - минимальный элемент типа BPQ и остаток от приоритетной очереди после извлечение минимума - &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;. &amp;lt;tex&amp;gt;merge&amp;lt;/tex&amp;gt; {{---}} функция, выполняющая слияние двух приоритетных очередей.&lt;br /&gt;
&lt;br /&gt;
Возвращаем BPQ, где &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; {{---}} новый минимальный элемент, и &amp;lt;tex&amp;gt;merge(r, t)&amp;lt;/tex&amp;gt; приоритетная очередь без элемента &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так как &amp;lt;tex&amp;gt;extractMin&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;merge&amp;lt;/tex&amp;gt; выполняются за &amp;lt;tex&amp;gt;O(log N)&amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;extractMin&amp;lt;/tex&amp;gt; выполняется за &amp;lt;tex&amp;gt;O(log N)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Смотри также ==&lt;br /&gt;
* [[Биномиальная куча]]&lt;br /&gt;
* [[Очередь]]&lt;br /&gt;
* [[Персистентная очередь]]&lt;br /&gt;
* [[Персистентная приоритетная очередь]]&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
[http://www.lektorium.tv/lecture/?id=14234 Лекция А.С. Станкевича по приоритетным очередям]&lt;br /&gt;
&lt;br /&gt;
[http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.48.973 Optimal Purely Functional Priority Queues]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Приоритетные очереди]]&lt;/div&gt;</summary>
		<author><name>94.25.229.57</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D1%83%D1%87%D0%B0_%D0%91%D1%80%D0%BE%D0%B4%D0%B0%D0%BB%D0%B0-%D0%9E%D0%BA%D0%B0%D1%81%D0%B0%D0%BA%D0%B8&amp;diff=31745</id>
		<title>Куча Бродала-Окасаки</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D1%83%D1%87%D0%B0_%D0%91%D1%80%D0%BE%D0%B4%D0%B0%D0%BB%D0%B0-%D0%9E%D0%BA%D0%B0%D1%81%D0%B0%D0%BA%D0%B8&amp;diff=31745"/>
				<updated>2013-06-11T08:49:32Z</updated>
		
		<summary type="html">&lt;p&gt;94.25.229.57: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Куча Бродала-Окасаки''' (англ. ''Brodal's and Okasaki's Priority Queue'') - основана на использовании [[Биномиальная куча|биномиальной кучи]] без каскадных ссылок, что позволяет делать &amp;lt;tex&amp;gt;insert&amp;lt;/tex&amp;gt; за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;, добавлении минимального элемента, позволяет получать минимальный элемент за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;, и идеи Data-structural bootstrapping, позволяющей выполнить &amp;lt;tex&amp;gt;merge&amp;lt;/tex&amp;gt; за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;. Удаление минимума работает за &amp;lt;tex&amp;gt;O(log N)&amp;lt;/tex&amp;gt; в худшем случае. Эти оценки являются асимптотически оптимальными среди всех основанных на сравнении приоритетных очередей.&lt;br /&gt;
&lt;br /&gt;
== Структура ==&lt;br /&gt;
Используем идею, которую Тарьян и Буксбаум называют Data-structural bootstrapping. &lt;br /&gt;
{{Определение&lt;br /&gt;
|neat = 0&lt;br /&gt;
|definition= Data-structural bootstrapping - это идея, позволяющая снизить время &amp;lt;tex&amp;gt;merge&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt; путем разрешения хранить в очереди другую очередь.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Создадим структуру Bootstrapping Priority Queues, которая будет хранить пару из минимального элемента &amp;lt;tex&amp;gt;T_{min}&amp;lt;/tex&amp;gt; и приоритетную очередь. Элементами приоритетной очереди будут Bootstrapping Priority Queues упорядоченные по &amp;lt;tex&amp;gt;T_{min}&amp;lt;/tex&amp;gt;. Это можно записать так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; BPQ&amp;lt;T_{min}, PQ&amp;gt; = (T_{min}, PQ&amp;lt;BPQ&amp;lt;T_{min}, PQ&amp;gt;&amp;gt;)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Куча из одного элемента будет выглядеть так&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;create(x) = BPQ&amp;lt;x, null&amp;gt;&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Данная структура не будет бесконечной, так как каждый раз в приоритетной очереди будет храниться на один элемент меньше, таким образом образуя иерархическую структуру. Каждое значение храниться в одном из значений &amp;lt;tex&amp;gt;T_{min}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Операции ==&lt;br /&gt;
=== Merge ===&lt;br /&gt;
Слияние выполняется выбором минимума из двух значений &amp;lt;tex&amp;gt;T_{min}&amp;lt;/tex&amp;gt; и добавлением в приоритетную очередь второго BPQ.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
merge((x,q), (y,r))&lt;br /&gt;
  if x&amp;lt;y&lt;br /&gt;
    return (x, insert(q, (y,r)))&lt;br /&gt;
  else&lt;br /&gt;
    return (y, insert(r, (x,q)))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Здесь &amp;lt;tex&amp;gt;insert&amp;lt;/tex&amp;gt; это добавление в приоритетную очередь работает за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;merge&amp;lt;/tex&amp;gt; работает за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
=== Insert ===&lt;br /&gt;
Это создание нового BPQ и &amp;lt;tex&amp;gt;merge&amp;lt;/tex&amp;gt; его с основным деревом.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
insert((x,q), y)&lt;br /&gt;
  return merge((x,q), create(y))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Создание и &amp;lt;tex&amp;gt;merge&amp;lt;/tex&amp;gt; выполняются за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;insert&amp;lt;/tex&amp;gt; работает за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
=== getMin ===&lt;br /&gt;
Выполняется просто, так как Bootstrapping хранит минимум.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
getMin((x,q))&lt;br /&gt;
  return x;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Очевидно, работает за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== extractMin ===&lt;br /&gt;
Минимальный элемент хранится в верхнем BPQ, по этому его поиск не нужен. Требуется извлечение минимума из приоритетной очереди BPQ'ов. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
extractMin((x,q))&lt;br /&gt;
  ((y,r), t) = extractMin(q)&lt;br /&gt;
  return (y, merge(r, t))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Здесь &amp;lt;tex&amp;gt;extractMin(q)&amp;lt;/tex&amp;gt; {{---}} это функция, извлекающая минимальный элемент типа BPQ из приоритетной очереди, она возвращает &amp;lt;tex&amp;gt;(y,r)&amp;lt;/tex&amp;gt; - минимальный элемент типа BPQ и остаток от приоритетной очереди после извлечение минимума - &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;. &amp;lt;tex&amp;gt;merge&amp;lt;/tex&amp;gt; {{---}} функция, выполняющая слияние двух приоритетных очередей.&lt;br /&gt;
&lt;br /&gt;
Возвращаем BPQ, где &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; {{---}} новый минимальный элемент, и &amp;lt;tex&amp;gt;merge(r, t)&amp;lt;/tex&amp;gt; приоритетная очередь без элемента &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так как &amp;lt;tex&amp;gt;extractMin&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;merge&amp;lt;/tex&amp;gt; выполняются за &amp;lt;tex&amp;gt;O(log N)&amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;extractMin&amp;lt;/tex&amp;gt; выполняется за &amp;lt;tex&amp;gt;O(log N)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Смотри также ==&lt;br /&gt;
* [[Биномиальная куча]]&lt;br /&gt;
* [[Очередь]]&lt;br /&gt;
* [[Персистентная очередь]]&lt;br /&gt;
* [[Персистентная приоритетная очередь]]&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
[http://www.lektorium.tv/lecture/?id=14234 Лекция А.С. Станкевича по приоритетным очередям]&lt;br /&gt;
&lt;br /&gt;
[http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.48.973 Optimal Purely Functional Priority Queues]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Приоритетные очереди]]&lt;/div&gt;</summary>
		<author><name>94.25.229.57</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D1%83%D1%87%D0%B0_%D0%91%D1%80%D0%BE%D0%B4%D0%B0%D0%BB%D0%B0-%D0%9E%D0%BA%D0%B0%D1%81%D0%B0%D0%BA%D0%B8&amp;diff=31744</id>
		<title>Куча Бродала-Окасаки</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D1%83%D1%87%D0%B0_%D0%91%D1%80%D0%BE%D0%B4%D0%B0%D0%BB%D0%B0-%D0%9E%D0%BA%D0%B0%D1%81%D0%B0%D0%BA%D0%B8&amp;diff=31744"/>
				<updated>2013-06-11T08:43:08Z</updated>
		
		<summary type="html">&lt;p&gt;94.25.229.57: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Куча Бродала-Окасаки''' (англ. ''Brodal's and Okasaki's Priority Queue'') - основана на использовании [[Биномиальная куча|биномиальной кучи]] без каскадных ссылок, добавлении минимального элемента и идеи Data-structural bootstrapping. Поддерживает поиск минимума, вставку, слияние за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt; в худшем случае и удаление минимума за &amp;lt;tex&amp;gt;O(log N)&amp;lt;/tex&amp;gt; в худшем случае. Эти оценки являются асимптотически оптимальными среди всех основанных на сравнении приоритетных очередей.&lt;br /&gt;
&lt;br /&gt;
== Структура ==&lt;br /&gt;
Используем идею, которую Тарьян и Буксбаум называют Data-structural bootstrapping. &lt;br /&gt;
{{Определение&lt;br /&gt;
|neat = 0&lt;br /&gt;
|definition= Data-structural bootstrapping - это идея, позволяющая снизить время &amp;lt;tex&amp;gt;merge&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt; путем разрешения хранить в очереди другую очередь.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Создадим структуру Bootstrapping Priority Queues, которая будет хранить пару из минимального элемента &amp;lt;tex&amp;gt;T_{min}&amp;lt;/tex&amp;gt; и приоритетную очередь. Элементами приоритетной очереди будут Bootstrapping Priority Queues упорядоченные по &amp;lt;tex&amp;gt;T_{min}&amp;lt;/tex&amp;gt;. Это можно записать так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; BPQ&amp;lt;T_{min}, PQ&amp;gt; = (T_{min}, PQ&amp;lt;BPQ&amp;lt;T_{min}, PQ&amp;gt;&amp;gt;)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Куча из одного элемента будет выглядеть так&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;create(x) = BPQ&amp;lt;x, null&amp;gt;&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Данная структура не будет бесконечной, так как каждый раз в приоритетной очереди будет храниться на один элемент меньше, таким образом образуя иерархическую структуру. Каждое значение храниться в одном из значений &amp;lt;tex&amp;gt;T_{min}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Операции ==&lt;br /&gt;
=== Merge ===&lt;br /&gt;
Слияние выполняется выбором минимума из двух значений &amp;lt;tex&amp;gt;T_{min}&amp;lt;/tex&amp;gt; и добавлением в приоритетную очередь второго BPQ.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
merge((x,q), (y,r))&lt;br /&gt;
  if x&amp;lt;y&lt;br /&gt;
    return (x, insert(q, (y,r)))&lt;br /&gt;
  else&lt;br /&gt;
    return (y, insert(r, (x,q)))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Здесь &amp;lt;tex&amp;gt;insert&amp;lt;/tex&amp;gt; это добавление в приоритетную очередь работает за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;merge&amp;lt;/tex&amp;gt; работает за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
=== Insert ===&lt;br /&gt;
Это создание нового BPQ и &amp;lt;tex&amp;gt;merge&amp;lt;/tex&amp;gt; его с основным деревом.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
insert((x,q), y)&lt;br /&gt;
  return merge((x,q), create(y))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Создание и &amp;lt;tex&amp;gt;merge&amp;lt;/tex&amp;gt; выполняются за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;insert&amp;lt;/tex&amp;gt; работает за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
=== getMin ===&lt;br /&gt;
Выполняется просто, так как Bootstrapping хранит минимум.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
getMin((x,q))&lt;br /&gt;
  return x;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Очевидно, работает за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== extractMin ===&lt;br /&gt;
Минимальный элемент хранится в верхнем BPQ, по этому его поиск не нужен. Требуется извлечение минимума из приоритетной очереди BPQ'ов. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
extractMin((x,q))&lt;br /&gt;
  ((y,r), t) = extractMin(q)&lt;br /&gt;
  return (y, merge(r, t))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Здесь &amp;lt;tex&amp;gt;extractMin(q)&amp;lt;/tex&amp;gt; {{---}} это функция, извлекающая минимальный элемент типа BPQ из приоритетной очереди, она возвращает &amp;lt;tex&amp;gt;(y,r)&amp;lt;/tex&amp;gt; - минимальный элемент типа BPQ и остаток от приоритетной очереди после извлечение минимума - &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;. &amp;lt;tex&amp;gt;merge&amp;lt;/tex&amp;gt; {{---}} функция, выполняющая слияние двух приоритетных очередей.&lt;br /&gt;
&lt;br /&gt;
Возвращаем BPQ, где &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; {{---}} новый минимальный элемент, и &amp;lt;tex&amp;gt;merge(r, t)&amp;lt;/tex&amp;gt; приоритетная очередь без элемента &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так как &amp;lt;tex&amp;gt;extractMin&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;merge&amp;lt;/tex&amp;gt; выполняются за &amp;lt;tex&amp;gt;O(log N)&amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;extractMin&amp;lt;/tex&amp;gt; выполняется за &amp;lt;tex&amp;gt;O(log N)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Смотри также ==&lt;br /&gt;
* [[Биномиальная куча]]&lt;br /&gt;
* [[Очередь]]&lt;br /&gt;
* [[Персистентная очередь]]&lt;br /&gt;
* [[Персистентная приоритетная очередь]]&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
[http://www.lektorium.tv/lecture/?id=14234 Лекция А.С. Станкевича по приоритетным очередям]&lt;br /&gt;
&lt;br /&gt;
[http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.48.973 Optimal Purely Functional Priority Queues]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Приоритетные очереди]]&lt;/div&gt;</summary>
		<author><name>94.25.229.57</name></author>	</entry>

	</feed>