Рубрики

Прото ван Эмде Боас Деревья | Комплект 1 (История вопроса и Введение)

Давайте рассмотрим приведенную ниже постановку задачи и подумаем о различных решениях.

Дан набор элементов S такой, что элементы взяты из вселенной {0, 1,…. u-1}, эффективно выполняйте следующие операции.

  • insert (x): добавляет элемент x в набор + S.
  • isEmpty (): возвращает true, если S пусто, иначе false.
  • find (x): Возвращает true, если x присутствует в S, иначе false.
  • insert (x): вставляет элемент x в S.
  • удалить (x): удалить элемент x из S.
  • max (): возвращает максимальное значение из S.
  • min (): возвращает минимальное значение из S.
  • successor (x): возвращает наименьшее значение в S, которое больше x.
  • priorcessor (x): возвращает наибольшее значение в S, которое меньше x.

Разные решения
Ниже приведены различные решения вышеуказанной проблемы.

  • Одним из решений этой проблемы является использование самобалансирующегося бинарного дерева поиска, такого как красно-черное дерево , дерево AVL и т. Д. С помощью этого решения мы можем выполнить все вышеуказанные операции за O (Log n) время.
  • Другим решением является использование двоичного массива (или Bitvector) . Мы создаем массив размером u и отмечаем наличие и отсутствие элемента как 1 или 0 соответственно. Это решение поддерживает операции вставки (), удаления () и поиска () за O (1), но в худшем случае другие операции могут занять время O (u).
  • Дерево Ван Эмде Боаса (или дерево vEB) поддерживает операции вставки (), удаления, поиска (), преемника () и предшественника () за O (Log Log u), а max () и min () в O (1) время. Примечание : в решении BST у нас есть временная сложность с точки зрения n, здесь у нас есть временная сложность с точки зрения u. Таким образом, дерево Ван Эмде Боаса может не подойти, когда u намного больше n.

Фон (наложение двоичной древовидной структуры на решение двоичного массива)
Временные сложности max (), min (), successor () и предшественника () высоки в случае решения Binary Array. Идея состоит в том, чтобы уменьшить временные сложности этих операций, накладывая поверх них бинарную древовидную структуру.

Объяснение вышеуказанной структуры:

  1. Листья двоичного дерева представляют записи двоичного массива.
  2. Внутренний узел имеет значение 1, если любой из его дочерних элементов имеет значение 1, т. Е. Значение внутреннего узла является побитовым ИЛИ всех значений его дочерних элементов.

С вышеупомянутой структурой мы оптимизировали max (), min (), successor () и предшественник () для временной сложности O (Log u).

  1. min (): начать с корня и перейти к листу, используя следующие правила. Во время обхода всегда выбирайте самого левого ребенка, т. Е. Посмотрите, равен ли левый ребенок 1, перейдите к левому ребенку, иначе — к правому ребенку. Конечный узел, которого мы достигаем таким образом, минимален.

    Поскольку мы путешествуем по высоте бинарного дерева с листьями u, временная сложность уменьшается до O (Log u)
  2. max (): аналогично min (). Вместо левого ребенка мы предпочитаем плотного ребенка.
  3. successor (x): Начните с листового узла, индексированного с помощью x, и двигайтесь по направлению к корню, пока мы не достигнем узла z, чей правый потомок равен 1, а не по тому же пути, который был пройден до сих пор. Остановитесь на z и двигайтесь вниз до листа, следующего за крайним левым узлом со значением 1.
  4. precessor (): эта операция аналогична преемнику. Здесь мы заменяем left на right и right на left в successor ().
  5. find () по-прежнему O (1), так как у нас все еще есть двоичный массив в виде листьев. insert () и delete () теперь O (Log u), так как нам нужно обновить внутренние узлы. В случае вставки мы помечаем соответствующий лист как 1, проходим вверх и продолжаем обновлять предков до 1, если они были 0.

Прото ван Эмде Боас Три
Мы видели, что наложение двоичного дерева на двоичный массив уменьшает временную сложность max (), min (), successor () и precessor () до O (Log u). Можем ли мы уменьшить сложность этого времени до O (Log Log u)?

Идея состоит в том, чтобы иметь различную степень на разных уровнях. Корневой узел (первый уровень) охватывает всю вселенную. Каждый узел второго уровня (рядом с корнем) покрывает 1/2 элемента вселенной. Каждый узел третьего уровня покрывает 1/4 элемента и так далее.

С вышеупомянутой рекурсивной структурой мы получаем временную сложность операций, используя нижнюю рекурсию.

T(u) = T(√u) + O(1)

Solution of this recurrence is,

T(u) = O(Log Log u)

Refer this for detailed steps to 
get the above result.

Рекурсивное определение прото ван Эмде Боаса Три:
Пусть u = 2 2 k — размер вселенной для некоторого k> = 0.

  1. Если u = 2, то это дерево байтового размера содержит только двоичный массив размера 2.
  2. В противном случае разбейте юниверс на blocks (u 1/2 ) блоков размером Θ (u 1/2 ) каждый и добавьте сводную структуру в начало.

Мы выполняем все запросы, используя подход, описанный в фоновом режиме.

В этой статье мы представили идею наложения древовидной структуры на двоичный массив таким образом, чтобы узлы разных уровней дерева имели разную степень. Мы скоро будем обсуждать следующее в следующих наборах.
1) Подробное представление.
2) Как оптимизировать max () и min () для работы в O (1)?
3) Осуществление вышеуказанных операций.

Источники:
http://www-di.inf.puc-rio.br/~laber/vanEmdeBoas.pdf
http://web.stanford.edu/class/cs166/lectures/14/Small14.pdf

Эта статья предоставлена Shubham Agrawal . Если вы как GeeksforGeeks и хотели бы внести свой вклад, вы также можете написать статью с помощью contribute.geeksforgeeks.org или по почте статьи contribute@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.

Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Рекомендуемые посты:

Прото ван Эмде Боас Деревья | Комплект 1 (История вопроса и Введение)

0.00 (0%) 0 votes