Jump to content

Ван Эмде Боас уходит в отставку

шаги ван Эмде Боаса
Тип Недвоичное дерево
Изобретенный 1975
Изобретён Питер ван Эмде Боас
Временная сложность в обозначении большого О
Операция Средний Худший случай
Поиск
Вставлять
Удалить
Пространственная сложность
Космос

Шагает Ван Эмде Боас ( Голландское произношение: [vɑn ˈɛmdə ˈboːɑs] ), также известное как дерево vEB или очередь приоритетов Ван Эмде Боаса , представляет собой древовидную структуру данных , которая реализует ассоциативный массив с m -битными целочисленными ключами. Он был изобретен командой под руководством голландского ученого-компьютерщика Питера ван Эмде Боаса в 1975 году. [1] Он выполняет все операции за время O (log m ) (при условии, что битовая операция может выполняться за постоянное время) или, что то же самое, за время, где — это самый большой элемент, который может быть сохранен в дереве. Параметр не следует путать с фактическим количеством элементов, хранящихся в дереве, по которому часто измеряется производительность других древовидных структур данных.

Стандартное дерево vEB имеет недостаточную эффективность использования пространства. Например, для хранения 32-битных целых чисел (т. е. когда , это требует биты памяти. Однако аналогичные структуры данных с одинаково хорошей эффективностью времени и пространства существуют там, где — это количество хранимых элементов, а деревья vEB можно изменить, потребовав только космос.

Поддерживаемые операции [ править ]

vEB поддерживает операции с упорядоченным ассоциативным массивом , который включает в себя обычные операции с ассоциативным массивом, а также еще две операции с упорядочением , FindNext и FindPrevious : [2]

  • Вставить : вставить пару ключ/значение с m -битным ключом.
  • Удалить : удалить пару ключ/значение с заданным ключом.
  • Поиск : найти значение, связанное с данным ключом.
  • FindNext : найти пару ключ/значение с наименьшим ключом, превышающим заданный k.
  • FindPrevious : найти пару ключ/значение с наибольшим ключом, который меньше заданного k.

Дерево vEB также поддерживает операции «Минимум» и «Максимум» , которые возвращают минимальный и максимальный элемент, хранящийся в дереве соответственно. [3] Оба они бегут время, поскольку минимальный и максимальный элементы хранятся как атрибуты в каждом дереве.

Функция [ править ]

Пример дерева Эмде Боаса
Пример дерева Ван Эмде Боаса с размерностью 5 и дополнительной структурой корня после вставки 1, 2, 3, 5, 8 и 10.

Позволять для некоторого целого числа . Определять . Дерево VEB Т над вселенной имеет корневой узел, в котором хранится массив Т.дети длины . T.children[i] — указатель на дерево vEB, отвечающее за значения . Кроме того, T хранит два значения Тмин и T.max, а также вспомогательное дерево vEB Ставка .

Данные хранятся в дереве vEB следующим образом: Наименьшее значение, находящееся в настоящее время в дереве, сохраняется в T.min и наибольшее значение сохраняются в Т.макс . Обратите внимание, что T.min больше нигде в дереве vEB не хранится, а Т.макс есть. Если T пусто, мы используем соглашение, согласно которому Т.макс=-1 и Т.мин=М . Любое другое значение хранится в поддереве Т.дети[i] где . Вспомогательное дерево T.aux отслеживает, какие дочерние элементы не пусты, поэтому T.aux содержит значение тогда и только тогда, когда T.children[j] непусто.

НайтиСледующий [ править ]

Операция FindNext(T, x) , который ищет преемника элемента x в дереве vEB, действует следующим образом: Если x <T.min , то поиск завершен и ответ Т.мин . Если x≥T.max , то следующий элемент не существует, верните M. В противном случае пусть . Если x<T.children[i].max , то искомое значение содержится в T.children[i], поэтому поиск продолжается рекурсивно в Т.дети[я] . В противном случае мы ищем преемника значения i в Т.ох. ​Это дает нам индекс j первого поддерева, содержащего элемент больше x . Затем алгоритм возвращает Т.дети[j].мин . Элемент, найденный на дочернем уровне, должен быть составлен из старших битов, чтобы сформировать полный следующий элемент.

функция  FindNext(T, x)     если  x < T.min  , то          вернуть  T.min     если  x ≥ T.max  , то   // следующий элемент не          возвращает  M    я = пол(х/ )    ло = х мод         если  lo < T.children[i].max  , то          верните  (  i) + FindNext(T.children[i], lo)    j = FindNext(T.aux, i)     возвращаться  (  j) + T.children[j].min конец 

Обратите внимание, что в любом случае алгоритм выполняет работать, а затем, возможно, рекурсивно работать по поддереву во вселенной размером (ан битовая вселенная). Это дает повторение для времени выполнения , что разрешает .

Вставить [ править ]

Звонок Insert(T, x) который вставляет значение x в дерево VEB Т действует следующим образом:

  1. Если T пусто, мы устанавливаем T.min = T.max = x , и все готово.
  2. В противном случае, если x<T.min , то мы вставляем T.min в поддерево я отвечаю за T.min , а затем установите Т.мин = х . Если T.children[i] ранее был пустым, тогда мы также вставляем я в Ставка
  3. В противном случае, если x>T.max , затем вставляем x в поддерево я отвечаю за х , а затем установите Т.макс = х . Если T.children[i] ранее был пустым, тогда мы также вставляем я в Ставка
  4. В противном случае, T.min< x < T.max, поэтому мы вставляем x в поддерево я отвечаю за х . Если T.children[i] ранее был пустым, тогда мы также вставляем я в Ставка .

В коде:

функция  Вставка(Т, х)     если  T.min == x || T.max == x  then   // x уже вставлен          return      if  T.min > T.max  then   // T пусто         Т.мин = Т.макс = х;         вернуть,      если  x < T.min,  тогда         своп(х, Т.мин)     если  x > T.max,  то         Т.макс = х    я = пол (х / )    ло = х мод     Вставить(T.children[i], вот)     если  T.children[i].min == T.children[i].max  , то         Вставить(T.aux, я) конец 

Ключом к эффективности этой процедуры является то, что вставка элемента в пустое дерево vEB занимает время O (1) . Таким образом, хотя алгоритм иногда выполняет два рекурсивных вызова, это происходит только в том случае, если первый рекурсивный вызов был обращен к пустому поддереву. Это дает ту же повторяемость времени выполнения как раньше.

Удалить [ править ]

Удаление из деревьев vEB — самая сложная операция. Звонок Функция Delete(T, x) , которая удаляет значение x из дерева vEB T, действует следующим образом:

  1. Если T.min = T.max = x , тогда x — единственный элемент, хранящийся в дереве, и мы устанавливаем Т.мин = М и T.max = −1, чтобы указать, что дерево пусто.
  2. В противном случае, если x == T.min , то нам нужно найти второе наименьшее значение y в дереве vEB, удалить его из текущего местоположения и установить Т.мин=у . Второе наименьшее значение y равно T.children[T.aux.min].min , поэтому его можно найти за время O (1) . Мы удаляем y из поддерева, которое его содержит.
  3. Если x≠T.min и x≠T.max , то мы удаляем x из поддерева T.children[i] который содержит x .
  4. Если x == T.max , то нам нужно будет найти второе по величине значение y в дереве vEB и установить Т.макс=у . Начнем с удаления x, как и в предыдущем случае. Тогда значение y либо Т.мин или T.children[T.aux.max].max , поэтому его можно найти за время O (1) .
  5. В любом из вышеперечисленных случаев, если мы удалим последний элемент x или y из любого поддерева T.children[i] то мы также удаляем i из Ставка .

В коде:

функция  Удалить(T, x)     если  T.min == T.max == x  , то         Т.мин = М        Т.макс = −1         вернуть,      если  x == T.min  , тогда         привет = T.aux.min *         j = T.aux.min        T.min = x = hi + T.children[j].min    я = пол (х / )    ло = х мод     Удалить(T.children[i], вот)     если  T.children[i] пуст  , то         Удалить(T.aux, я)     если  x == T.max  , то          если  T.aux пуст  , то             Т.макс = Т.мин.         еще             привет = T.aux.max *             j = T.aux.max            Т.макс = привет + Т.дети[j].макс конец 

Опять же, эффективность этой процедуры зависит от того, что удаление из дерева vEB, содержащего только один элемент, занимает постоянное время. В частности, второй вызов удаления выполняется только в том случае, если x был единственным элементом в T.children[i] до удаления.

На практике [ править ]

Предположение о том, что log m является целым числом, не является необходимым. Операции и можно заменить, взяв только биты высшего порядка m /2⌉ и младшего m /2⌋ числа x соответственно. На любой существующей машине это более эффективно, чем вычисления деления или остатка.

В практических реализациях, особенно на машинах с инструкциями сдвига на k и поиска первого нуля , производительность можно дополнительно повысить за счет переключения на битовый массив , как только будет достигнуто m, равное размеру слова (или небольшому кратному ему). Поскольку все операции с одним словом выполняются за постоянное время, это не влияет на асимптотическую производительность, но позволяет избежать большей части хранения указателей и нескольких разыменований указателей, достигая значительной практической экономии времени и пространства с помощью этого трюка.

Оптимизация деревьев vEB заключается в исключении пустых поддеревьев. Это делает деревья vEB довольно компактными, когда они содержат много элементов, поскольку поддеревья не создаются до тех пор, пока к ним не потребуется что-то добавить. Первоначально каждый добавленный элемент создает около log( m ) новых деревьев, содержащих около m /2 указателей вместе. По мере роста дерева все больше и больше поддеревьев используются повторно, особенно более крупные. В полном дереве из M элементов O( M ) используется только пространство . Более того, в отличие от бинарного дерева поиска, большая часть этого пространства используется для хранения данных: даже для миллиардов элементов указатели в полном дереве vEB исчисляются тысячами.

Описанная выше реализация использует указатели и занимает общее пространство O ( M ) = O (2 м ) , пропорционально размеру ключевого юниверса. Это можно увидеть следующим образом. Повторение .Решение этого вопроса приведет к .К счастью, можно также показать по индукции, что S ( M ) = M −2 . [4]

Подобные структуры [ править ]

Использование пространства O ( M ) для деревьев vEB является огромными накладными расходами, если только не сохраняется большая часть совокупности ключей. Это одна из причин, почему деревья vEB не пользуются популярностью на практике. Это ограничение можно устранить, изменив массив, используемый для хранения дочерних элементов, на другую структуру данных. Одна из возможностей — использовать только фиксированное количество битов на уровень, что приводит к созданию trie . Альтернативно, каждый массив может быть заменен хеш-таблицей , уменьшая пространство до O ( n log log M ) (где n — количество элементов, хранящихся в структуре данных) за счет рандомизации структуры данных.

Попытки x-fast и более сложные попытки y-fast имеют время обновления и запроса, сопоставимое с деревьями vEB, и используют рандомизированные хэш-таблицы для уменьшения используемого пространства. Попытки x-fast используют O ( n log M ), пространство O ( n ) а попытки y-fast используют пространство .

Деревья слияния — это еще один тип древовидной структуры данных, который реализует ассоциативный массив w-битных целых чисел в конечной вселенной. Они используют параллелизм на уровне слов и методы манипуляции битами для достижения времени O (log w n ) для предшественника/преемника запросов и обновлений , где w — размер слова. [5] Деревья слияния используют пространство O ( n ) и могут быть сделаны динамическими с помощью хеширования или экспоненциальных деревьев.

Реализации [ править ]

Есть проверенная реализация в Isabelle (помощник по доказательству) . [6] Доказаны как функциональная корректность, так и временные ограничения. эффективный императивный стандартный код ML Можно создать .

См. также [ править ]

Ссылки [ править ]

  1. ^ Питер ван Эмде Боас : Сохранение порядка в лесу менее чем за логарифмическое время ( Материалы 16-го ежегодного симпозиума по основам компьютерных наук 10: 75-84, 1975)
  2. ^ Гудмунд Сковбьерг Франдсен : Динамические алгоритмы: Конспекты курса по деревьям Ван Эмде Боаса (PDF) ( Орхусский университет , факультет компьютерных наук)
  3. ^ Томас Х. Кормен , Чарльз Э. Лейзерсон , Рональд Л. Ривест и Клиффорд Штайн . Введение в алгоритмы , третье издание. МИТ Пресс , 2009. ISBN   978-0-262-53305-8 . Глава 20: Дерево Боаз из Эмде, стр. 107-1. 531–560.
  4. ^ Рекс, А. «Определение пространственной сложности деревьев Ван Эмде Боаса» . Проверено 27 мая 2011 г.
  5. ^ «Дерево слияния» . OpenGenus IQ: опыт и наследие в области вычислений . 04.04.2019 . Проверено 30 августа 2023 г.
  6. ^ Аммер, Томас; Ламмих, Питер. "Деревья Ван Эмде Боаса" . Архив формальных доказательств . Проверено 26 ноября 2021 г.

Дальнейшее чтение [ править ]

Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 9010dd7b2ff0e6debb0bce71e6588455__1715614920
URL1:https://arc.ask3.ru/arc/aa/90/55/9010dd7b2ff0e6debb0bce71e6588455.html
Заголовок, (Title) документа по адресу, URL1:
Van Emde Boas tree - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)