<?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=109.188.196.221&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=109.188.196.221&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/109.188.196.221"/>
		<updated>2026-04-27T09:14:12Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%91%D0%B8%D0%BD%D0%BE%D0%BC%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%BA%D1%83%D1%87%D0%B0&amp;diff=18785</id>
		<title>Биномиальная куча</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%91%D0%B8%D0%BD%D0%BE%D0%BC%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%BA%D1%83%D1%87%D0%B0&amp;diff=18785"/>
				<updated>2012-03-05T18:12:23Z</updated>
		
		<summary type="html">&lt;p&gt;109.188.196.221: /* Источники */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Биномиальное дерево &amp;lt;tex&amp;gt;B_k&amp;lt;/tex&amp;gt;''' {{---}} [[Дерево, эквивалентные определения|дерево]], определяемое для каждого &amp;lt;tex&amp;gt;k = 0, 1, 2, \dots &amp;lt;/tex&amp;gt; следующим образом: &amp;lt;tex&amp;gt;B_0&amp;lt;/tex&amp;gt; - дерево, состоящее из одного узла высоты 0, то есть состоит из одного узла; &amp;lt;tex&amp;gt;B_k&amp;lt;/tex&amp;gt; состоит из двух биномиальных деревьев &amp;lt;tex&amp;gt;B_{k-1}&amp;lt;/tex&amp;gt;, связанны вместе таким образом, что корень одного из них является крайним левым дочерним узлом корня второго дерева.}}&lt;br /&gt;
&lt;br /&gt;
Пример биномиального дерева для k = 0, 2, 3.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Example.jpg|325px|]]&lt;br /&gt;
&lt;br /&gt;
'''Свойства биномиальных деревьев. '''&lt;br /&gt;
Биномиальное дерево &amp;lt;tex&amp;gt;B_k&amp;lt;/tex&amp;gt; с n вершинами:&lt;br /&gt;
*имеет &amp;lt;tex&amp;gt;2^k&amp;lt;/tex&amp;gt; узлов;&lt;br /&gt;
*имеет высоту k;&lt;br /&gt;
*имеет ровно &amp;lt;tex&amp;gt;{k\choose i}&amp;lt;/tex&amp;gt; узлов на высоте &amp;lt;tex&amp;gt;i = 0, 1, 2, \dots&amp;lt;/tex&amp;gt;;&lt;br /&gt;
*имеет корень степени k; степерь всех остальных вершин меньше степени корня биномиального дерева;&lt;br /&gt;
*максимальная степень произвольного узла в биномиальном дереве с n узлами равна &amp;lt;tex&amp;gt;\log(n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Биномиальная пирамида ([[Двоичная куча|куча]]) H''' {{---}} представляет собой множество биномиальных деревьев, которые удовлетворяют следующим свойствам '''биномиальных пирамид'''.&lt;br /&gt;
*Каждое биномиальное дерево в Н подчиняется свойству '''неубывающей пирамиды''': ключ узла не меньше ключа его родительского узла (упорядоченное в соответствии со свойством неубывающей пирамиды дерево).&lt;br /&gt;
*Для любого неотрицательного целого k найдется не более одного биномиального дерева Н, чей корень имеет степень K.}}&lt;br /&gt;
&lt;br /&gt;
==== Представление биномиальных куч ====&lt;br /&gt;
Поскольку количество детей у узлов варьируется в широких пределах, ссылка на детей осуществляется через левого ребенка, а остальные дети образуют односвязный список. Каждый узел в биномиальной пирамиде (куче) представляется набором полей:&lt;br /&gt;
*''key'' {{---}} ключ (вес) элемента;&lt;br /&gt;
*''parent'' {{---}} указатель на родителя узла;&lt;br /&gt;
*''child'' {{---}} указатель на левого ребенка узла;&lt;br /&gt;
*''sibling'' {{---}} указатель на правого брата узла;&lt;br /&gt;
*''degree'' {{---}} степень узла (количество дочерних узлов данного узла).&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;
Рассмотрим операции, которые можно производить с биномиальной пирамидой. Их асимптотические оценки показаны в таблице.&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |makeHeap&lt;br /&gt;
 |&amp;lt;tex&amp;gt;\Theta(1)&amp;lt;/tex&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 |insert&lt;br /&gt;
 |&amp;lt;tex&amp;gt;O(\log(n))&amp;lt;/tex&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 |getMinimum&lt;br /&gt;
 |&amp;lt;tex&amp;gt;O(\log(n))&amp;lt;/tex&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 |extractMin&lt;br /&gt;
 |&amp;lt;tex&amp;gt;\Theta(\log(n))&amp;lt;/tex&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 |merge&lt;br /&gt;
 |&amp;lt;tex&amp;gt;\Omega(\log(n))&amp;lt;/tex&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 |decreaseKey&lt;br /&gt;
 |&amp;lt;tex&amp;gt;\Theta(\log(n))&amp;lt;/tex&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 |delete&lt;br /&gt;
 |&amp;lt;tex&amp;gt;\Theta(\log(n))&amp;lt;/tex&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
=== makeHeap ===&lt;br /&gt;
Для создания пустой биномиальной пирамиды процедура makeBinomialHeap просто выделяет память и возвращает объект H, где head[H] = null, то есть пирамида не содержит элементов.&lt;br /&gt;
&lt;br /&gt;
=== getMinimum ===&lt;br /&gt;
Для нахождения минимального элемента надо найти элемент в списке корней с минимальным значением (предполагается, что ключей, равных &amp;lt;tex&amp;gt;\infty&amp;lt;/tex&amp;gt;, нет).&lt;br /&gt;
&lt;br /&gt;
Асимптотика этой операции получается из того, что корней в этом списке не более &amp;lt;tex&amp;gt;\lfloor \log(n) \rfloor + 1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
При вызове этой процедуры для кучи, изображенной на картинке ниже, будет возвращен указатель на вершину с ключем 1.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Example2.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
=== merge ===&lt;br /&gt;
Эта операция, соединяющая две биномиальные кучи в одну, используется в качестве подпрограммы большинством остальных операций.&lt;br /&gt;
&lt;br /&gt;
Для этого нам надо сначала слить списки корней &amp;lt;tex&amp;gt;H_1, H_2&amp;lt;/tex&amp;gt; в единый связный список, отсортированный по степеням в монотонно возрастающем порядке. Свойство пирамиды обеспечивает нам в новом списке наличие не более двух деревьев одинаковой степени. Далее мы за один проход по этому списку объединим некоторые деревья так, что в результате все они будут иметь попарно разные степени. На каждом шаге нам надо расмотреть несколько случаев.&lt;br /&gt;
&lt;br /&gt;
* Рассматриваемое дерево и следующее за ним имеют разные степени (случай ''a'' на рисунке). Ситуация тривиальна и не требует никаких действий. Переходим к следующему шагу.&lt;br /&gt;
* Текущее дерево и его два ближаших соседа справа (то есть те, которые встретятся на последующих итерациях) имеют одинаковые степени (случай ''b'' на рисунке). Эта ситуация хоть и не тривиальна, но ее следует оставить для следующего шага.&lt;br /&gt;
* Если степень текущего и последующего деревьев одинакова (случай ''c-d'' на рисунке), то нам следует объединить их в новое дерево (сделав корнем вершину того дерева, чей ключ наименьший), степень которого будет на единицу больше той, что была ранее.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Example3.jpg|300]]&lt;br /&gt;
&lt;br /&gt;
Пример пирамиды до merge и после:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Example5.jpg]]&lt;br /&gt;
&lt;br /&gt;
=== insert ===&lt;br /&gt;
Необходимо просто создать биномиальную пирамиду &amp;lt;tex&amp;gt;H'&amp;lt;/tex&amp;gt; с одним узлом за время &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt; и объединяет ее с биномиальной пирамидой Н, содержащей n узлов, за время &amp;lt;tex&amp;gt;O(\log(n))&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== extractMin ===&lt;br /&gt;
Приведенная ниже процедура извлекает узел с минимальным ключом из биномиальной кучи и возвращает указатель на извлеченный узел:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  extractMin(H)&lt;br /&gt;
    поиск корня х с минимальным значением ключа в списке корней Н, и удаление х из корней Н&lt;br /&gt;
  H' = Make_Binomial_Heap()&lt;br /&gt;
  Обращение порядка связанного списка дочерних узлов х,&lt;br /&gt;
    установка поля р каждого дочернего узла Н равным NIL&lt;br /&gt;
    присвоение указателю head[H'] адреса заголовка &lt;br /&gt;
    получающегося списка&lt;br /&gt;
  H = Binomial_Heap_Union(H, H')&lt;br /&gt;
  return x&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поскольку минимальный элемент находится в корневом списке, найти его легко; после его удаления соответствующее дерево рассыпается в набор биномиальных деревьев меньшего размера, который надо объединить с оставшейся частью кучи. &lt;br /&gt;
Все действия выполняются за время &amp;lt;tex&amp;gt;O(\log n)&amp;lt;/tex&amp;gt;, так что общее время работы процедуры есть &amp;lt;tex&amp;gt;O(\log n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== decreaseKey ===&lt;br /&gt;
Следующая процедура уменьшает ключ элемента x биномиальной кучи, присваивая ему новое значение. Вершина, ключ которой был уменьшен, «всплывает» наверх. Процедура выполняется за время &amp;lt;tex&amp;gt;O(\log n)&amp;lt;/tex&amp;gt;, поскольку глубина вершины x есть &amp;lt;tex&amp;gt;O(\log n)&amp;lt;/tex&amp;gt; (свойства биномиального дерева), а при выполнении каждого шага алгоритма мы поднимаемся вверх.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  Binomial_Heap_Decrease_Key(H, x, k)&lt;br /&gt;
    if k &amp;gt; key[x] then&lt;br /&gt;
      return&lt;br /&gt;
    key[x] = k&lt;br /&gt;
    y = x&lt;br /&gt;
    z = p[y]&lt;br /&gt;
    while (z &amp;lt;tex&amp;gt;\ne&amp;lt;/tex&amp;gt; NIL and key[y] &amp;lt; key[z]) do&lt;br /&gt;
      swap(key[y], key[z])&lt;br /&gt;
    y = z&lt;br /&gt;
    z = p[y]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример работы процедуры проиллюстрирован на рисунке (y - уменьшаемый элемент, z - его предок).&lt;br /&gt;
&lt;br /&gt;
[[Файл:Example6.jpg|600px]]&lt;br /&gt;
&lt;br /&gt;
=== delete ===&lt;br /&gt;
Удаление ключа сводится к двум предыдущим операциям: мы уменьшаем ключ до минимально возможного значения, а затем удаляем вершину с минимальным ключом. В процессе выполнения процедуры это значение всплывает вверх, откуда и удаляется. Процедура выполняется за время &amp;lt;tex&amp;gt;O(\log n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  Binomial_Heap_Delete(H, x)&lt;br /&gt;
    Binomial_Heap_Decrease_Key(H, x, -&amp;lt;tex&amp;gt;\infty&amp;lt;/tex&amp;gt;)&lt;br /&gt;
    Binomial_Heap_Extract_Min(H)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Источники ==&lt;br /&gt;
----&lt;br /&gt;
* [http://www.intuit.ru/department/algorithms/dscm/7/ INTUIT.ru - Биномиальные кучи]&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Binomial_heap Wikipedia - Binomial heap]&lt;br /&gt;
* Кормен Т. Алгоритмы: построение и анализ. 2-е изд., 2007. Страницы 538-558.&lt;/div&gt;</summary>
		<author><name>109.188.196.221</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%91%D0%B8%D0%BD%D0%BE%D0%BC%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%BA%D1%83%D1%87%D0%B0&amp;diff=18784</id>
		<title>Биномиальная куча</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%91%D0%B8%D0%BD%D0%BE%D0%BC%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%BA%D1%83%D1%87%D0%B0&amp;diff=18784"/>
				<updated>2012-03-05T18:05:04Z</updated>
		
		<summary type="html">&lt;p&gt;109.188.196.221: /* Операции над биномиальными пирамидами */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Биномиальное дерево &amp;lt;tex&amp;gt;B_k&amp;lt;/tex&amp;gt;''' {{---}} [[Дерево, эквивалентные определения|дерево]], определяемое для каждого &amp;lt;tex&amp;gt;k = 0, 1, 2, \dots &amp;lt;/tex&amp;gt; следующим образом: &amp;lt;tex&amp;gt;B_0&amp;lt;/tex&amp;gt; - дерево, состоящее из одного узла высоты 0, то есть состоит из одного узла; &amp;lt;tex&amp;gt;B_k&amp;lt;/tex&amp;gt; состоит из двух биномиальных деревьев &amp;lt;tex&amp;gt;B_{k-1}&amp;lt;/tex&amp;gt;, связанны вместе таким образом, что корень одного из них является крайним левым дочерним узлом корня второго дерева.}}&lt;br /&gt;
&lt;br /&gt;
Пример биномиального дерева для k = 0, 2, 3.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Example.jpg|325px|]]&lt;br /&gt;
&lt;br /&gt;
'''Свойства биномиальных деревьев. '''&lt;br /&gt;
Биномиальное дерево &amp;lt;tex&amp;gt;B_k&amp;lt;/tex&amp;gt; с n вершинами:&lt;br /&gt;
*имеет &amp;lt;tex&amp;gt;2^k&amp;lt;/tex&amp;gt; узлов;&lt;br /&gt;
*имеет высоту k;&lt;br /&gt;
*имеет ровно &amp;lt;tex&amp;gt;{k\choose i}&amp;lt;/tex&amp;gt; узлов на высоте &amp;lt;tex&amp;gt;i = 0, 1, 2, \dots&amp;lt;/tex&amp;gt;;&lt;br /&gt;
*имеет корень степени k; степерь всех остальных вершин меньше степени корня биномиального дерева;&lt;br /&gt;
*максимальная степень произвольного узла в биномиальном дереве с n узлами равна &amp;lt;tex&amp;gt;\log(n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Биномиальная пирамида ([[Двоичная куча|куча]]) H''' {{---}} представляет собой множество биномиальных деревьев, которые удовлетворяют следующим свойствам '''биномиальных пирамид'''.&lt;br /&gt;
*Каждое биномиальное дерево в Н подчиняется свойству '''неубывающей пирамиды''': ключ узла не меньше ключа его родительского узла (упорядоченное в соответствии со свойством неубывающей пирамиды дерево).&lt;br /&gt;
*Для любого неотрицательного целого k найдется не более одного биномиального дерева Н, чей корень имеет степень K.}}&lt;br /&gt;
&lt;br /&gt;
==== Представление биномиальных куч ====&lt;br /&gt;
Поскольку количество детей у узлов варьируется в широких пределах, ссылка на детей осуществляется через левого ребенка, а остальные дети образуют односвязный список. Каждый узел в биномиальной пирамиде (куче) представляется набором полей:&lt;br /&gt;
*''key'' {{---}} ключ (вес) элемента;&lt;br /&gt;
*''parent'' {{---}} указатель на родителя узла;&lt;br /&gt;
*''child'' {{---}} указатель на левого ребенка узла;&lt;br /&gt;
*''sibling'' {{---}} указатель на правого брата узла;&lt;br /&gt;
*''degree'' {{---}} степень узла (количество дочерних узлов данного узла).&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;
Рассмотрим операции, которые можно производить с биномиальной пирамидой. Их асимптотические оценки показаны в таблице.&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 |makeHeap&lt;br /&gt;
 |&amp;lt;tex&amp;gt;\Theta(1)&amp;lt;/tex&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 |insert&lt;br /&gt;
 |&amp;lt;tex&amp;gt;O(\log(n))&amp;lt;/tex&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 |getMinimum&lt;br /&gt;
 |&amp;lt;tex&amp;gt;O(\log(n))&amp;lt;/tex&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 |extractMin&lt;br /&gt;
 |&amp;lt;tex&amp;gt;\Theta(\log(n))&amp;lt;/tex&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 |merge&lt;br /&gt;
 |&amp;lt;tex&amp;gt;\Omega(\log(n))&amp;lt;/tex&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 |decreaseKey&lt;br /&gt;
 |&amp;lt;tex&amp;gt;\Theta(\log(n))&amp;lt;/tex&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 |delete&lt;br /&gt;
 |&amp;lt;tex&amp;gt;\Theta(\log(n))&amp;lt;/tex&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
=== makeHeap ===&lt;br /&gt;
Для создания пустой биномиальной пирамиды процедура makeBinomialHeap просто выделяет память и возвращает объект H, где head[H] = null, то есть пирамида не содержит элементов.&lt;br /&gt;
&lt;br /&gt;
=== getMinimum ===&lt;br /&gt;
Для нахождения минимального элемента надо найти элемент в списке корней с минимальным значением (предполагается, что ключей, равных &amp;lt;tex&amp;gt;\infty&amp;lt;/tex&amp;gt;, нет).&lt;br /&gt;
&lt;br /&gt;
Асимптотика этой операции получается из того, что корней в этом списке не более &amp;lt;tex&amp;gt;\lfloor \log(n) \rfloor + 1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
При вызове этой процедуры для кучи, изображенной на картинке ниже, будет возвращен указатель на вершину с ключем 1.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Example2.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
=== merge ===&lt;br /&gt;
Эта операция, соединяющая две биномиальные кучи в одну, используется в качестве подпрограммы большинством остальных операций.&lt;br /&gt;
&lt;br /&gt;
Для этого нам надо сначала слить списки корней &amp;lt;tex&amp;gt;H_1, H_2&amp;lt;/tex&amp;gt; в единый связный список, отсортированный по степеням в монотонно возрастающем порядке. Свойство пирамиды обеспечивает нам в новом списке наличие не более двух деревьев одинаковой степени. Далее мы за один проход по этому списку объединим некоторые деревья так, что в результате все они будут иметь попарно разные степени. На каждом шаге нам надо расмотреть несколько случаев.&lt;br /&gt;
&lt;br /&gt;
* Рассматриваемое дерево и следующее за ним имеют разные степени (случай ''a'' на рисунке). Ситуация тривиальна и не требует никаких действий. Переходим к следующему шагу.&lt;br /&gt;
* Текущее дерево и его два ближаших соседа справа (то есть те, которые встретятся на последующих итерациях) имеют одинаковые степени (случай ''b'' на рисунке). Эта ситуация хоть и не тривиальна, но ее следует оставить для следующего шага.&lt;br /&gt;
* Если степень текущего и последующего деревьев одинакова (случай ''c-d'' на рисунке), то нам следует объединить их в новое дерево (сделав корнем вершину того дерева, чей ключ наименьший), степень которого будет на единицу больше той, что была ранее.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Example3.jpg|300]]&lt;br /&gt;
&lt;br /&gt;
Пример пирамиды до merge и после:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Example5.jpg]]&lt;br /&gt;
&lt;br /&gt;
=== insert ===&lt;br /&gt;
Необходимо просто создать биномиальную пирамиду &amp;lt;tex&amp;gt;H'&amp;lt;/tex&amp;gt; с одним узлом за время &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt; и объединяет ее с биномиальной пирамидой Н, содержащей n узлов, за время &amp;lt;tex&amp;gt;O(\log(n))&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== extractMin ===&lt;br /&gt;
Приведенная ниже процедура извлекает узел с минимальным ключом из биномиальной кучи и возвращает указатель на извлеченный узел:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  extractMin(H)&lt;br /&gt;
    поиск корня х с минимальным значением ключа в списке корней Н, и удаление х из корней Н&lt;br /&gt;
  H' = Make_Binomial_Heap()&lt;br /&gt;
  Обращение порядка связанного списка дочерних узлов х,&lt;br /&gt;
    установка поля р каждого дочернего узла Н равным NIL&lt;br /&gt;
    присвоение указателю head[H'] адреса заголовка &lt;br /&gt;
    получающегося списка&lt;br /&gt;
  H = Binomial_Heap_Union(H, H')&lt;br /&gt;
  return x&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поскольку минимальный элемент находится в корневом списке, найти его легко; после его удаления соответствующее дерево рассыпается в набор биномиальных деревьев меньшего размера, который надо объединить с оставшейся частью кучи. &lt;br /&gt;
Все действия выполняются за время &amp;lt;tex&amp;gt;O(\log n)&amp;lt;/tex&amp;gt;, так что общее время работы процедуры есть &amp;lt;tex&amp;gt;O(\log n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== decreaseKey ===&lt;br /&gt;
Следующая процедура уменьшает ключ элемента x биномиальной кучи, присваивая ему новое значение. Вершина, ключ которой был уменьшен, «всплывает» наверх. Процедура выполняется за время &amp;lt;tex&amp;gt;O(\log n)&amp;lt;/tex&amp;gt;, поскольку глубина вершины x есть &amp;lt;tex&amp;gt;O(\log n)&amp;lt;/tex&amp;gt; (свойства биномиального дерева), а при выполнении каждого шага алгоритма мы поднимаемся вверх.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  Binomial_Heap_Decrease_Key(H, x, k)&lt;br /&gt;
    if k &amp;gt; key[x] then&lt;br /&gt;
      return&lt;br /&gt;
    key[x] = k&lt;br /&gt;
    y = x&lt;br /&gt;
    z = p[y]&lt;br /&gt;
    while (z &amp;lt;tex&amp;gt;\ne&amp;lt;/tex&amp;gt; NIL and key[y] &amp;lt; key[z]) do&lt;br /&gt;
      swap(key[y], key[z])&lt;br /&gt;
    y = z&lt;br /&gt;
    z = p[y]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример работы процедуры проиллюстрирован на рисунке (y - уменьшаемый элемент, z - его предок).&lt;br /&gt;
&lt;br /&gt;
[[Файл:Example6.jpg|600px]]&lt;br /&gt;
&lt;br /&gt;
=== delete ===&lt;br /&gt;
Удаление ключа сводится к двум предыдущим операциям: мы уменьшаем ключ до минимально возможного значения, а затем удаляем вершину с минимальным ключом. В процессе выполнения процедуры это значение всплывает вверх, откуда и удаляется. Процедура выполняется за время &amp;lt;tex&amp;gt;O(\log n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  Binomial_Heap_Delete(H, x)&lt;br /&gt;
    Binomial_Heap_Decrease_Key(H, x, -&amp;lt;tex&amp;gt;\infty&amp;lt;/tex&amp;gt;)&lt;br /&gt;
    Binomial_Heap_Extract_Min(H)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Источники ==&lt;br /&gt;
----&lt;br /&gt;
* [http://www.intuit.ru/department/algorithms/dscm/7/ INTUIT.ru |Биномиальные кучи]&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Binomial_heap Wikipedia | Binomial_heap]&lt;br /&gt;
* Кормен Т., Лейзерсон Ч., Ривест Р. Алгоритмы: построение и анализ. — 2-е изд. — М.: Издательский дом «Вильямс», 2007. — С. 538-558.&lt;/div&gt;</summary>
		<author><name>109.188.196.221</name></author>	</entry>

	</feed>