<?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=84.242.228.169&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=84.242.228.169&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/84.242.228.169"/>
		<updated>2026-07-24T14:07:13Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%94%D0%B5%D1%80%D0%B5%D0%B2%D0%BE_%D0%B2%D0%B0%D0%BD_%D0%AD%D0%BC%D0%B4%D0%B5_%D0%91%D0%BE%D0%B0%D1%81%D0%B0&amp;diff=20343</id>
		<title>Дерево ван Эмде Боаса</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%94%D0%B5%D1%80%D0%B5%D0%B2%D0%BE_%D0%B2%D0%B0%D0%BD_%D0%AD%D0%BC%D0%B4%D0%B5_%D0%91%D0%BE%D0%B0%D1%81%D0%B0&amp;diff=20343"/>
				<updated>2012-04-07T20:52:51Z</updated>
		
		<summary type="html">&lt;p&gt;84.242.228.169: /* Операции */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Дерево ван Эмде Боаса''' {{---}} структура данных, представляющая собой дерево поиска, позволяющее хранить целые неотрицательные числа в интервале &amp;lt;tex&amp;gt;[0;2^k)&amp;lt;/tex&amp;gt; и осуществлять над ними все соответствующие дереву поиска операции.&lt;br /&gt;
}}&lt;br /&gt;
Проще говоря, данная структура позволяет хранить &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;-битные числа и производить над ними операции &amp;lt;tex&amp;gt;find&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;insert&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;remove&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;next&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;prev&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;min&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;max&amp;lt;/tex&amp;gt; и некоторые другие операции, которые присущи всем деревьям поиска.&lt;br /&gt;
&lt;br /&gt;
Особенностью этой структуры является то, что все операции выполняются за &amp;lt;tex&amp;gt;O(\log k)&amp;lt;/tex&amp;gt;, что асимптотически лучше, чем &amp;lt;tex&amp;gt;O(\log n)&amp;lt;/tex&amp;gt; в большинстве других деревьев поиска, где &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; {{---}} количество элементов в дереве.&lt;br /&gt;
&lt;br /&gt;
= Структура =&lt;br /&gt;
[[Файл:Boas.jpg.jpg|right|378px|thumb|корень дерева]]&lt;br /&gt;
&lt;br /&gt;
Для удобства работы с деревом будем использовать &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;, равные степени двойки.&lt;br /&gt;
&lt;br /&gt;
Как уже было сказано выше, &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;-дерево хранит числа в интервале &amp;lt;tex&amp;gt;[0;2^k)&amp;lt;/tex&amp;gt;. Тогда 1-дерево хранит информацию, содержатся ли в нем 0 и 1.&lt;br /&gt;
&lt;br /&gt;
Построим &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;-дерево, при &amp;lt;tex&amp;gt;k \neq 1&amp;lt;/tex&amp;gt;. В нем будут хранится:&lt;br /&gt;
*массив &amp;lt;tex&amp;gt;children&amp;lt;/tex&amp;gt;, состоящий из &amp;lt;tex&amp;gt;2^{k/2}&amp;lt;/tex&amp;gt;  &amp;lt;tex&amp;gt;k/2&amp;lt;/tex&amp;gt;-деревьев&lt;br /&gt;
*вспомогательное &amp;lt;tex&amp;gt;k/2&amp;lt;/tex&amp;gt;-дерево, которое назовем &amp;lt;tex&amp;gt;aux&amp;lt;/tex&amp;gt;&lt;br /&gt;
*максимальный и минимальный элемент, хранящийся в этом дереве (если оно не является пустым)&lt;br /&gt;
&lt;br /&gt;
Пусть у нас есть &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;-битное число &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;. Разобьем это число таким образом, что &amp;lt;tex&amp;gt;high(x)&amp;lt;/tex&amp;gt; {{---}} число, соответствующее &amp;lt;tex&amp;gt;k/2&amp;lt;/tex&amp;gt; старшим битам числа &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;, а &amp;lt;tex&amp;gt;low(x)&amp;lt;/tex&amp;gt; соответствует &amp;lt;tex&amp;gt;k/2&amp;lt;/tex&amp;gt; младшим битам. Тогда информация, хранится ли в данном дереве число &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;, эквивалентна информации, содержится ли в дереве &amp;lt;tex&amp;gt;children[high(x)]&amp;lt;/tex&amp;gt; число &amp;lt;tex&amp;gt;low(x)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нетрудно увидеть, что высота подобного дерева &amp;lt;tex&amp;gt;\ log_{2} k&amp;lt;/tex&amp;gt;, так как каждый следующий уровень дерева содержит числа, количество битов в которых в 2 раза меньше, чем в предыдущем.&lt;br /&gt;
&lt;br /&gt;
Во вспомогательном дереве &amp;lt;tex&amp;gt;aux&amp;lt;/tex&amp;gt; будем хранить все такие числа &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt;, что дерево &amp;lt;tex&amp;gt;children[p]&amp;lt;/tex&amp;gt; не пусто.&lt;br /&gt;
&lt;br /&gt;
= Операции =&lt;br /&gt;
== empty ==&lt;br /&gt;
Чтобы определить, пусто ли дерево, будем изначально инициализировать поле &amp;lt;tex&amp;gt;min&amp;lt;/tex&amp;gt; числом, которое не лежит в интервале &amp;lt;tex&amp;gt;[0;2^k)&amp;lt;/tex&amp;gt;. Назовем это число &amp;lt;tex&amp;gt;none&amp;lt;/tex&amp;gt;. Например, это может быть &amp;lt;tex&amp;gt;-1&amp;lt;/tex&amp;gt;, если мы храним в числа в знаковом целочисленном типе, или &amp;lt;tex&amp;gt;2^k&amp;lt;/tex&amp;gt;, если в беззнаковом. Тогда проверка на пустоту дерева будет заключаться лишь в сравнении поля &amp;lt;tex&amp;gt;min&amp;lt;/tex&amp;gt; с этим числом.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
empty(T)&lt;br /&gt;
  if T.min == none&lt;br /&gt;
    return true;&lt;br /&gt;
  else&lt;br /&gt;
    return false;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== min и max ==&lt;br /&gt;
Так как мы храним в дереве минимальное и максимальное значения, то данные операции не требуют ничего, кроме вывода значения поля &amp;lt;tex&amp;gt;min&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;max&amp;lt;/tex&amp;gt; в соответствии с запросом. Время выполнения данных операций соответственно &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
== find ==&lt;br /&gt;
Алгоритм поиска сам напрашивается из выше описанной структуры:&lt;br /&gt;
*если дерево пусто, то число не содержится в нашей структуре&lt;br /&gt;
*если число равно полю &amp;lt;tex&amp;gt;min&amp;lt;/tex&amp;gt;, то число в дереве есть&lt;br /&gt;
*иначе ищем число &amp;lt;tex&amp;gt;low(x)&amp;lt;/tex&amp;gt; в поддереве &amp;lt;tex&amp;gt;children[high(x)]&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
find(T, x)&lt;br /&gt;
  if empty(T)&lt;br /&gt;
    return false;&lt;br /&gt;
  if T.min == x&lt;br /&gt;
    return true;&lt;br /&gt;
  return find(T.children[high(x)], low(x));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== insert ==&lt;br /&gt;
Операция вставки элемента &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; состоит из нескольких частей:&lt;br /&gt;
&lt;br /&gt;
*если дерево пусто, то присвоим полям &amp;lt;tex&amp;gt;min&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;max&amp;lt;/tex&amp;gt; значение &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;. Делать что-то еще бессмысленно, так как информация записанная в &amp;lt;tex&amp;gt;min&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;max&amp;lt;/tex&amp;gt; полностью описывает состояние текущего дерева.&lt;br /&gt;
*иначе:&lt;br /&gt;
**обновим поля &amp;lt;tex&amp;gt;min&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;max&amp;lt;/tex&amp;gt; текущего дерева, если это требуется&lt;br /&gt;
**вставим во вспомогательное дерево &amp;lt;tex&amp;gt;aux&amp;lt;/tex&amp;gt; число &amp;lt;tex&amp;gt;high(x)&amp;lt;/tex&amp;gt;, если соответствующее поддерево &amp;lt;tex&amp;gt;children[high(x)]&amp;lt;/tex&amp;gt; до этого было пусто&lt;br /&gt;
**вставим число &amp;lt;tex&amp;gt;low(x)&amp;lt;/tex&amp;gt; в поддерево &amp;lt;tex&amp;gt;children[high(x)]&amp;lt;/tex&amp;gt;, за исключением ситуации, когда текущее дерево {{---}} это 1-дерево, и дальнейшая вставка не требуется&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
insert(T, x)&lt;br /&gt;
  if empty(T)                               // проверка на пустоту текущего дерева&lt;br /&gt;
    T.min = x;&lt;br /&gt;
    T.max = x;&lt;br /&gt;
  else&lt;br /&gt;
    if T.min &amp;gt; x&lt;br /&gt;
      T.min = x;                            // релаксация минимума&lt;br /&gt;
    if T.max &amp;lt; x&lt;br /&gt;
      T.max = x;                            // релаксация максимума&lt;br /&gt;
    if T.k != 1&lt;br /&gt;
      if empty(T.children[high(x)])&lt;br /&gt;
        insert(T.aux, high(x));             // вставка high(x) во вспомогательно дерево aux&lt;br /&gt;
      insert(T.children[high(x)], low(x));  // вставка low(x) в поддерево children[high(x)]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Нетрудно увидеть, что данная операция работает за время &amp;lt;tex&amp;gt;O(\log k)&amp;lt;/tex&amp;gt;. На каждом уровне дерева мы выполняем &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt; операций. После этого возможны 2 случая: поддерево &amp;lt;tex&amp;gt;children[high(x)]&amp;lt;/tex&amp;gt; пусто, и мы будем производить дальнейшую вставку и в него, и во вспомогательное дерево &amp;lt;tex&amp;gt;aux&amp;lt;/tex&amp;gt;, или же поддерево не пусто, и мы просто спустимся на уровень ниже. Но если поддерево &amp;lt;tex&amp;gt;children[high(x)]&amp;lt;/tex&amp;gt; пусто, то вставка в него будет выполнена за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;, так как мы всего лишь обновим поля &amp;lt;tex&amp;gt;min&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;max&amp;lt;/tex&amp;gt;. Все остальные операции будут выполнятся уже со вспомогательным деревом &amp;lt;tex&amp;gt;aux&amp;lt;/tex&amp;gt;, высота которого на 1 уровень меньше, чем высота текущего. Если же поддерево &amp;lt;tex&amp;gt;children[high(x)]&amp;lt;/tex&amp;gt; не пусто, то мы просто перейдем к вставке элемента в это поддерево, высота которого так же на 1 меньше, чем у текущего. В итоге, каждый раз, выполнив &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt; операций, мы переходим к дереву, высота которого на 1 меньше, чем у текущего. Следовательно, количество операций пропорционально высоте дерева, которая, как уже было показано, &amp;lt;tex&amp;gt;O(\log k)&amp;lt;/tex&amp;gt;. То есть операция вставки займет &amp;lt;tex&amp;gt;O(\log k)&amp;lt;/tex&amp;gt; времени.&lt;br /&gt;
&lt;br /&gt;
== remove ==&lt;br /&gt;
Удаление из дерева T также делится на несколько подзадач:&lt;br /&gt;
*Если T.min = T.max = x, значит в дереве один элемент, мы его удалим и как-нибудь пометим, что дерево пусто(на будущее).&lt;br /&gt;
*Если x = T.min,то мы должны найти следующий второй минимум удалить его из того места где он находится и поставить в  T.min Второй минимум - это либо T.max, либо T.children[T.aux.min].min.&lt;br /&gt;
Аналогично для случая x = T.max&lt;br /&gt;
*Если же x = T.min и x = T.max, то мы должны удалить x из поддерева i отвечающего x. &lt;br /&gt;
Важно, что Delete реализован рекурсивно от дерева в котором идет удаления.&lt;br /&gt;
Так же нельзя забывать, что если мы удаляем последнее вхождение x, то мы должны удалить i из вспомогательного дерева.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Delete(T, x)&lt;br /&gt;
  if (T.min == T.max == x)&lt;br /&gt;
    T.min = M&lt;br /&gt;
    T.max = -1&lt;br /&gt;
    return&lt;br /&gt;
  if (x == T.min)&lt;br /&gt;
    if (T.aux is empty)&lt;br /&gt;
      T.min = T.max&lt;br /&gt;
      return&lt;br /&gt;
    else&lt;br /&gt;
      x = T.children[T.aux.min].min&lt;br /&gt;
      T.min = x&lt;br /&gt;
  if (x == T.max)&lt;br /&gt;
    if (T.aux is empty)&lt;br /&gt;
      T.max = T.min&lt;br /&gt;
      return&lt;br /&gt;
    else&lt;br /&gt;
      x = T.children[T.aux.max].max&lt;br /&gt;
      T.max = x&lt;br /&gt;
  if (T.aux is empty)&lt;br /&gt;
    return&lt;br /&gt;
  i = floor(x/sqrt(M))&lt;br /&gt;
  Delete(T.children[i], x%sqrt(M))&lt;br /&gt;
  if (T.children[i] is empty) &lt;br /&gt;
    Delete(T.aux, i)&lt;br /&gt;
(с)wikipedia.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== next и prev ==&lt;br /&gt;
&lt;br /&gt;
= Источники =&lt;br /&gt;
&lt;br /&gt;
*[http://en.wikipedia.org/wiki/Van_Emde_Boas_tree Van Emde Boas tree — Wikipedia]&lt;br /&gt;
*[http://habrahabr.ru/post/125499 Дерево ван Эмде Боаса — habrahabr.ru]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Деревья поиска]]&lt;/div&gt;</summary>
		<author><name>84.242.228.169</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%94%D0%B5%D1%80%D0%B5%D0%B2%D0%BE_%D0%B2%D0%B0%D0%BD_%D0%AD%D0%BC%D0%B4%D0%B5_%D0%91%D0%BE%D0%B0%D1%81%D0%B0&amp;diff=20333</id>
		<title>Дерево ван Эмде Боаса</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%94%D0%B5%D1%80%D0%B5%D0%B2%D0%BE_%D0%B2%D0%B0%D0%BD_%D0%AD%D0%BC%D0%B4%D0%B5_%D0%91%D0%BE%D0%B0%D1%81%D0%B0&amp;diff=20333"/>
				<updated>2012-04-07T16:50:11Z</updated>
		
		<summary type="html">&lt;p&gt;84.242.228.169: /* Структура */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Дерево ван Эмде Боаса''' {{---}} структура данных, представляющая собой дерево поиска, позволяющее хранить целые неотрицательные числа в интервале &amp;lt;tex&amp;gt;[0;2^k)&amp;lt;/tex&amp;gt; и осуществлять над ними все соответствующие дереву поиска операции.&lt;br /&gt;
}}&lt;br /&gt;
Проще говоря, данная структура позволяет хранить &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;-битные числа и производить над ними операции &amp;lt;tex&amp;gt;find&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;insert&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;remove&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;next&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;prev&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;min&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;max&amp;lt;/tex&amp;gt; и некоторые другие операции, которые присущи всем деревьям поиска.&lt;br /&gt;
&lt;br /&gt;
Особенностью этой структуры является то, что все операции выполняются за &amp;lt;tex&amp;gt;O(\log k)&amp;lt;/tex&amp;gt;, что асимптотически лучше, чем &amp;lt;tex&amp;gt;O(\log n)&amp;lt;/tex&amp;gt; в большинстве других деревьев поиска, где &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; {{---}} количество элементов в дереве.&lt;br /&gt;
&lt;br /&gt;
= Структура =&lt;br /&gt;
[[Файл:Boas.jpg.jpg|right|378px|thumb|корень дерева]]&lt;br /&gt;
&lt;br /&gt;
Для удобства работы с деревом будем использовать &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;, равные степени двойки.&lt;br /&gt;
&lt;br /&gt;
Как уже было сказано выше, &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;-дерево хранит числа в интервале &amp;lt;tex&amp;gt;[0;2^k]&amp;lt;/tex&amp;gt;. Тогда 1-дерево хранит информацию, содержатся ли в нем 0 и 1.&lt;br /&gt;
&lt;br /&gt;
Построим &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;-дерево, при &amp;lt;tex&amp;gt;k \neq 1&amp;lt;/tex&amp;gt;. В нем будут хранится:&lt;br /&gt;
*массив &amp;lt;tex&amp;gt;children&amp;lt;/tex&amp;gt;, состоящий из &amp;lt;tex&amp;gt;2^{k/2}&amp;lt;/tex&amp;gt;  &amp;lt;tex&amp;gt;k/2&amp;lt;/tex&amp;gt;-деревьев&lt;br /&gt;
*вспомогательное &amp;lt;tex&amp;gt;k/2&amp;lt;/tex&amp;gt;-дерево, которое назовем &amp;lt;tex&amp;gt;aux&amp;lt;/tex&amp;gt;&lt;br /&gt;
*максимальный и минимальный элемент, хранящийся в этом дереве (если оно не является пустым)&lt;br /&gt;
&lt;br /&gt;
Пусть у нас есть &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;-битное число &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;. Разобьем это число таким образом, что &amp;lt;tex&amp;gt;high(x)&amp;lt;/tex&amp;gt; {{---}} число, соответствующее &amp;lt;tex&amp;gt;k/2&amp;lt;/tex&amp;gt; старшим битам числа &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;, а &amp;lt;tex&amp;gt;low(x)&amp;lt;/tex&amp;gt; соответствует &amp;lt;tex&amp;gt;k/2&amp;lt;/tex&amp;gt; младшим битам. Тогда информация, хранится ли в данном дереве число &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;, эквивалентна информации, содержится ли в дереве &amp;lt;tex&amp;gt;children[high(x)]&amp;lt;/tex&amp;gt; число &amp;lt;tex&amp;gt;low(x)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нетрудно увидеть, что высота подобного дерева &amp;lt;tex&amp;gt;\ log_{2} k&amp;lt;/tex&amp;gt;, так как каждый следующий уровень дерева содержит числа, количество битов в которых в 2 раза меньше, чем в предыдущем.&lt;br /&gt;
&lt;br /&gt;
Во вспомогательном дереве &amp;lt;tex&amp;gt;aux&amp;lt;/tex&amp;gt; будем хранить все такие числа &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt;, что дерево &amp;lt;tex&amp;gt;children[p]&amp;lt;/tex&amp;gt; не пусто.&lt;br /&gt;
&lt;br /&gt;
= Операции =&lt;br /&gt;
Рассмотрим две опeрации &lt;br /&gt;
Insert(x)&lt;br /&gt;
Delete(T, x)&lt;br /&gt;
== find ==&lt;br /&gt;
== insert ==&lt;br /&gt;
Операция добавления элемента &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; - эта задача делится на несколько частей&lt;br /&gt;
&lt;br /&gt;
*Если дерево пусто, то меняем значения минимума и максимума на x;&lt;br /&gt;
*Если x&amp;lt;T.min тогда мы кладем T.min в поддерево i соответствующее T.min и ставим T.min = x. Если поддерево[i] до этого было пусто то мы также добавляем i в вспомогательное дерево.&lt;br /&gt;
Аналогично если x&amp;gt;T.max.&lt;br /&gt;
*Если T.min&amp;lt; x &amp;lt; T.max тогда кладем x в поддерево i соответствующее x и меняем вспомогательное дерево.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Insert(T, x)&lt;br /&gt;
  if (T.min &amp;gt; T.max)    // T is empty&lt;br /&gt;
    T.min = T.max = x;&lt;br /&gt;
    return&lt;br /&gt;
  if (T.min = T.max)&lt;br /&gt;
    if (x &amp;lt; T.min)&lt;br /&gt;
      T.min = x;&lt;br /&gt;
    if (x &amp;gt; T.max)&lt;br /&gt;
      T.max = x;&lt;br /&gt;
    return&lt;br /&gt;
  if (x &amp;lt; T.min)&lt;br /&gt;
    swap(x, T.min)&lt;br /&gt;
  if (x &amp;gt; T.max)&lt;br /&gt;
    swap(x, T.max)&lt;br /&gt;
  i = x/sqrt(M)&lt;br /&gt;
  Insert(T.children[i], x % sqrt(M))&lt;br /&gt;
  if (T.children[i].min = T.children[i].max)&lt;br /&gt;
    Insert(T.aux, i)&lt;br /&gt;
&lt;br /&gt;
(с)wikipedia.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== remove ==&lt;br /&gt;
Удаление из дерева T также делится на несколько подзадач:&lt;br /&gt;
*Если T.min = T.max = x, значит в дереве один элемент, мы его удалим и как-нибудь пометим, что дерево пусто(на будущее).&lt;br /&gt;
*Если x = T.min,то мы должны найти следующий второй минимум удалить его из того места где он находится и поставить в  T.min Второй минимум - это либо T.max, либо T.children[T.aux.min].min.&lt;br /&gt;
Аналогично для случая x = T.max&lt;br /&gt;
*Если же x = T.min и x = T.max, то мы должны удалить x из поддерева i отвечающего x. &lt;br /&gt;
Важно, что Delete реализован рекурсивно от дерева в котором идет удаления.&lt;br /&gt;
Так же нельзя забывать, что если мы удаляем последнее вхождение x, то мы должны удалить i из вспомогательного дерева.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Delete(T, x)&lt;br /&gt;
  if (T.min == T.max == x)&lt;br /&gt;
    T.min = M&lt;br /&gt;
    T.max = -1&lt;br /&gt;
    return&lt;br /&gt;
  if (x == T.min)&lt;br /&gt;
    if (T.aux is empty)&lt;br /&gt;
      T.min = T.max&lt;br /&gt;
      return&lt;br /&gt;
    else&lt;br /&gt;
      x = T.children[T.aux.min].min&lt;br /&gt;
      T.min = x&lt;br /&gt;
  if (x == T.max)&lt;br /&gt;
    if (T.aux is empty)&lt;br /&gt;
      T.max = T.min&lt;br /&gt;
      return&lt;br /&gt;
    else&lt;br /&gt;
      x = T.children[T.aux.max].max&lt;br /&gt;
      T.max = x&lt;br /&gt;
  if (T.aux is empty)&lt;br /&gt;
    return&lt;br /&gt;
  i = floor(x/sqrt(M))&lt;br /&gt;
  Delete(T.children[i], x%sqrt(M))&lt;br /&gt;
  if (T.children[i] is empty) &lt;br /&gt;
    Delete(T.aux, i)&lt;br /&gt;
(с)wikipedia.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== min и max ==&lt;br /&gt;
&lt;br /&gt;
== next и prev ==&lt;br /&gt;
&lt;br /&gt;
= Источники =&lt;br /&gt;
&lt;br /&gt;
*[http://en.wikipedia.org/wiki/Van_Emde_Boas_tree Van Emde Boas tree — Wikipedia]&lt;br /&gt;
*[http://habrahabr.ru/post/125499 Дерево ван Эмде Боаса — habrahabr.ru]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Деревья поиска]]&lt;/div&gt;</summary>
		<author><name>84.242.228.169</name></author>	</entry>

	</feed>