Лекция 8: Дерево Ван Эмде Боаса (Van Emde Boas tree)

24
Лекция 8: Дерево Ван Эмде Боаса (Van Emde Boas tree) Курносов Михаил Георгиевич к.т.н. доцент Кафедры вычислительных систем Сибирский государственный университет телекоммуникаций и информатики http://www.mkurnosov.net

Transcript of Лекция 8: Дерево Ван Эмде Боаса (Van Emde Boas tree)

Page 1: Лекция 8: Дерево Ван Эмде Боаса (Van Emde Boas tree)

Лекция 8:

Дерево Ван Эмде Боаса

(Van Emde Boas tree)

Курносов Михаил Георгиевич

к.т.н. доцент Кафедры вычислительных систем

Сибирский государственный университет

телекоммуникаций и информатики

http://www.mkurnosov.net

Page 2: Лекция 8: Дерево Ван Эмде Боаса (Van Emde Boas tree)

Дерево Ван Эмде Боаса (Van Emde Boas tree)

2

Дерево Ван Эмде Боаса (Van Emde Boas tree, vEB tree) –

это дерево поиска (search tree) для хранения целочисленных

неотрицательных ключей из множества {0, 1, …, u – 1}

Для хранения ключа требуется 𝑚 = log2 𝑢 бит

Ключ (key) – это m-битное целое число

Основные операции (add, delete, lookup, min, max) выполняются

за время 𝑂(log log 𝑢), что асимптотически лучше, чем 𝑂 log 𝑛в сбалансированных бинарных деревьях поиска (AVL tree,

red-black tree)

Автор: Peter van Emde Boas, 1975

Peter van Emde Boas. Preserving order in a forest in less than logarithmic time //

Proceedings of the 16th Annual Symposium on Foundations of Computer Science,

1975, p. 75-84

Page 3: Лекция 8: Дерево Ван Эмде Боаса (Van Emde Boas tree)

Дерево Ван Эмде Боаса (Van Emde Boas tree)

3

Дерево Ван Эмде Боаса (Van Emde Boas tree, vEB tree) –

это дерево поиска (search tree) для хранения целочисленных

неотрицательных ключей из множества {0, 1, …, u – 1}

Например, пусть ключи – это целые числа из множества

{0, 1, …, 1000}

Тогда u = 1000 + 1 = 1001 (мощность множества ключей)

Для хранения ключа с максимальным значением 1000

необходимо log2 1000 + 1 = 9.97 + 1 = 10 бит

Максимальноезначение ключа

Количество бит для хранения ключа

255 8 (uint8_t)

65 535 16 (uint16_t)

4 294 967 295 32 (uint32_t)

264 – 1 64 (uint64_t)

Page 4: Лекция 8: Дерево Ван Эмде Боаса (Van Emde Boas tree)

Структура дерева Ван Эмде Боаса

4

Обозначим через vEB(u) дерево Ван Эмде Боаса, содержащее

ключи из множества {0, 1, …, u – 1}

Каждый узел дерева vEB(u) содержит:

указатель summary на дерево 𝑣𝐸𝐵 2log2 𝑢

2

массив cluster[0. . 2log2 𝑢

2 − 1] указателей

на корни деревьев 𝑣𝐸𝐵 2log2 𝑢

2

минимальный min элемент в дереве vEB

(копии min нет в поддеревьях cluster[…])

максимальный max элемент в дереве vEB

значение u

Page 5: Лекция 8: Дерево Ван Эмде Боаса (Van Emde Boas tree)

Пример дерева vEB(16)

5

vEB(16) u: 16 min: 2 max: 15

summary cluster[]:

vEB(4) u: 4 min: 0 max: 3

summary cluster[]:

vEB(4) u: 4 min: 3 max: 3

summary cluster[]:

vEB(2)

u: 2

min: -

max: -

vEB(2)

u: 2

min: -

max: -

vEB(2)

u: 2

min: -

max: -

vEB(2)

u: 2

min: 0

max: 1

vEB(2)

u: 2

min: 1

max: 1

vEB(2)

u: 2

min: 1

max: 1

vEB(4) u: 4 min: 2 max: 3

summary cluster[]:

vEB(2)

u: 2

min: 1

max: 1

vEB(2)

u: 2

min: -

max: -

vEB(2)

u: 2

min: 1

max: 1

vEB(4) u: 4 min: - max: -

summary cluster[]:

vEB(2)

u: 2

min: -

max: -

vEB(2)

u: 2

min: -

max: -

vEB(2)

u: 2

min: -

max: -

vEB(4) u: 4 min: 0 max: 3

summary cluster[]:

vEB(2)

u: 2

min: 0

max: 1

vEB(2)

u: 2

min: 1

max: 1

vEB(2)

u: 2

min: 1

max: 1

Дерево vEB(16), содержащее ключи 2, 3, 4, 5, 7, 14, 15

Данные только в полях min, max

Page 6: Лекция 8: Дерево Ван Эмде Боаса (Van Emde Boas tree)

Пример дерева vEB(16)

6

vEB(16) u: 16 min: 2 max: 15

summary cluster[]:

vEB(4) u: 4 min: 0 max: 3

summary cluster[]:

vEB(4) u: 4 min: 3 max: 3

summary cluster[]:

vEB(2)

u: 2

min: -

max: -

vEB(2)

u: 2

min: -

max: -

vEB(2)

u: 2

min: -

max: -

vEB(2)

u: 2

min: 0

max: 1

vEB(2)

u: 2

min: 1

max: 1

vEB(2)

u: 2

min: 1

max: 1

vEB(4) u: 4 min: 2 max: 3

summary cluster[]:

vEB(2)

u: 2

min: 1

max: 1

vEB(2)

u: 2

min: -

max: -

vEB(2)

u: 2

min: 1

max: 1

vEB(4) u: 4 min: - max: -

summary cluster[]:

vEB(2)

u: 2

min: -

max: -

vEB(2)

u: 2

min: -

max: -

vEB(2)

u: 2

min: -

max: -

vEB(4) u: 4 min: 0 max: 3

summary cluster[]:

vEB(2)

u: 2

min: 0

max: 1

vEB(2)

u: 2

min: 1

max: 1

vEB(2)

u: 2

min: 1

max: 1

15

2

75

11

0100 10

10

3 4

14

Дерево vEB(16), содержащее ключи 2, 3, 4, 5, 7, 14, 15

Данные только в полях min, max

Page 7: Лекция 8: Дерево Ван Эмде Боаса (Van Emde Boas tree)

Структура дерева Ван Эмде Боаса

7

Значения (value) ассоциированные с ключами хранятся только

в полях min, max узлов (min.value, max.value)

Ключ не храниться в узлах (аналогия с trie, prefix tree) –

биты ключа распределены по узлам на пути от корня к листьям

Время выполнения операций не зависит от количества n

элементов в дереве

Хранение min и max в узлах позволяет сократить глубину спуска

по дереву при поиске минимального/максимального элемента,

а также при поиске следующего элемента

(next, successor) и предыдущего (prev, predecessor)

Page 8: Лекция 8: Дерево Ван Эмде Боаса (Van Emde Boas tree)

Структура дерева Ван Эмде Боаса

8

В ключе “закодирован” путь в дереве vEB

Пример, ключи из множества {0, 1, …, 65535}, u = 65536 = 216

Дерево vEB(65536)

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

1 0 1 1 0 0 1 1 0 0 1 0 1 1 0 1Key:

Индекс в cluster[]

уровня 0 (корень) Индекс в cluster[]

уровня 1Индекс

уровня 2

high(key) = 101100112 = 17910

high(x) = 210

high(x) = 310

Page 9: Лекция 8: Дерево Ван Эмде Боаса (Van Emde Boas tree)

Структура дерева Ван Эмде Боаса

9

В ключе “закодирован” путь в дереве vEB

Пример, ключи из множества {0, 1, …, 65535}, u = 65536 = 216

Дерево vEB(65536)

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

1 0 1 1 0 0 1 1 0 0 1 0 1 1 0 1Key:

Индекс в cluster[]

уровня 0 (корень) Индекс в cluster[]

уровня 1Индекс

уровня 2

high(key) = 101100112 = 17910

high(x) = 210

high(x) = 310

𝐥𝐨𝐠𝟐 𝒖

𝟐𝟏𝐥𝐨𝐠𝟐 𝒖

𝟐𝟐 𝐥𝐨𝐠𝟐 𝒖

𝟐𝟑…Размер интервала (подключа)

уменьшается по геометрической прогрессии

Page 10: Лекция 8: Дерево Ван Эмде Боаса (Van Emde Boas tree)

log2 𝑢

2𝑘= 1, log2 𝑢 = 2𝑘 ,

Структура дерева Ван Эмде Боаса

10

В ключе “закодирован” путь в дереве vEB

Пример, ключи из множества {0, 1, …, 65535}, u = 65536 = 216

Дерево vEB(65536)

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

1 0 1 1 0 0 1 1 0 0 1 0 1 1 0 1Key:

𝐥𝐨𝐠𝟐 𝒖

𝟐𝟏𝐥𝐨𝐠𝟐 𝒖

𝟐𝟐𝐥𝐨𝐠𝟐 𝒖

𝟐𝟑 …

Сколько интервалов (подключей) в исходном ключе?

Разбиение (спуск) продолжается пока длина интервала не станет ≤ 2

𝐥𝐨𝐠𝟐 𝒖

𝟐𝒌= 𝟏

𝑘 = log log 𝑢

Page 11: Лекция 8: Дерево Ван Эмде Боаса (Van Emde Boas tree)

Структура дерева Ван Эмде Боаса

11

Дерево vEB(65536), u = 65536 = 216

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

1 0 1 1 0 0 1 1 0 0 1 0 1 1 0 1Key:

Индекс в cluster[]

уровня 0 (корень) Индекс в cluster[]

уровня 1Индекс

уровня 2

high(key) = 101100112 = 17910

high(x) = 210

high(x) = 310𝒉𝒊𝒈𝒉 𝒙 =𝒙

𝟐log𝟐 𝒖

𝟐

𝒍𝒐𝒘 𝒙 = 𝒙 mod 𝟐log𝟐 𝒖

𝟐Половина старших битов

Половина младших битовℎ𝑖𝑔ℎ 45869 =

45869

28= 179

𝑙𝑜𝑤 45869 = 45869 mod 256 = 45

Page 12: Лекция 8: Дерево Ван Эмде Боаса (Van Emde Boas tree)

Поиск экстремальных (min/max) элементов

12

function vEB_Min(tree)return tree.min

end function

function vEB_Max(tree)return tree.max

end function

Вместе с деревом хранятся минимальный и максимальный

элементы, доступ к ним осуществляется за время O(1)

TMin = O(1)

TMax = O(1)

Page 13: Лекция 8: Дерево Ван Эмде Боаса (Van Emde Boas tree)

Поиск элемента в дереве vEB

13

function vEB_Lookup(tree, key)if key = tree.min.key then

return tree.minif key = tree.max.key then

return tree.max

// Дерево vEB(2) данных кроме min, max не имеетif tree.u = 2

return NULL

hi = high(key) // Номер поддерева в cluster[]lo = low(key) // Новый ключreturn vEB_Lookup(tree.cluster[hi], lo)

end function

TLookup = O(log(logu))

Рекурсивно спускаемся по дереву проверяя поля min и max

С каждым рекурсивным вызовом длина ключа key уменьшается:

key -> low(key) -> low(low(key)) -> low(low(low(key))) -> …

Page 14: Лекция 8: Дерево Ван Эмде Боаса (Van Emde Boas tree)

Поиск в дереве vEB(16) элемента 7 (01112)

14

vEB(16) u: 16 min: 2 max: 15

summary cluster[]:

vEB(4) u: 4 min: 0 max: 3

summary cluster[]:

vEB(4) u: 4 min: 3 max: 3

summary cluster[]:

vEB(2)

u: 2

min: -

max: -

vEB(2)

u: 2

min: -

max: -

vEB(2)

u: 2

min: -

max: -

vEB(2)

u: 2

min: 0

max: 1

vEB(2)

u: 2

min: 1

max: 1

vEB(2)

u: 2

min: 1

max: 1

vEB(4) u: 4 min: 2 max: 3

summary cluster[]:

vEB(2)

u: 2

min: 1

max: 1

vEB(2)

u: 2

min: -

max: -

vEB(2)

u: 2

min: 1

max: 1

vEB(4) u: 4 min: - max: -

summary cluster[]:

vEB(2)

u: 2

min: -

max: -

vEB(2)

u: 2

min: -

max: -

vEB(2)

u: 2

min: -

max: -

vEB(4) u: 4 min: 0 max: 3

summary cluster[]:

vEB(2)

u: 2

min: 0

max: 1

vEB(2)

u: 2

min: 1

max: 1

vEB(2)

u: 2

min: 1

max: 1

Дерево vEB(16), содержащее ключи 2, 3, 4, 5, 7, 14, 15

high(7) = high(0111) = 1 low(7) = low(0111) = 3

Запись для

key = 7в поле

max

Lookup(vEB(16), 7)

Lookup(vEB(4), 3)

1

2

Page 15: Лекция 8: Дерево Ван Эмде Боаса (Van Emde Boas tree)

Добавление элемента в пустое дерево vEB

15

function vEB_AddEmpty(tree, key, value)// Дерево пусто – заполняем поля min, maxtree.min.key = keytree.min.value = valuetree.max.key = keytree.max.value = value

end function TAddEmpty = O(1)

При вставке элемента в пустое дерево, заносим его в поля min и max

После вставки в дереве один элемент и min = max

Page 16: Лекция 8: Дерево Ван Эмде Боаса (Van Emde Boas tree)

Добавление элемента в дерево vEB

16

function vEB_Add(tree, key, value)if tree.min = NULL then

// Дерево пустоvEB_AddEmpty(tree, key, value)

end if

if key < tree.min.key then// Заменим min новым значением, а старый min // добавим в поддерево swap(<min.key, min.value>, <key, value>)

end if

Добавление элемента в дерево выполняется рекурсивно, при каждом

вызове (для каждого поддерева) обрабатываем возможные ситуации:

Если поддерево пусто, добавляем элемент в поля min и max

Если ключ меньше ключа min, заменяем в min ключ на новый, а старый

ключ min вставим в поддерево позднее (см. ниже)

Page 17: Лекция 8: Дерево Ван Эмде Боаса (Van Emde Boas tree)

Добавление элемента в дерево vEB

17

if tree.u > 2 thenhi = high(key)lo = low(key)if vEB_Min(tree.cluster[hi]) = NULL then

// Поддерево hi пустоvEB_Add(tree.summary, hi)vEB_AddEmpty(tree.cluster[hi], lo)

elsevEB_Add(tree.cluster[hi], lo)

end if

if key > tree.max.key then// Обновляем maxtree.max.key = keytree.max.value = value

end ifend function

Рекурсивно спускаемся пока, не дойдем до узла с u ≤ 2

TAdd = O(log(log(u)))

Page 18: Лекция 8: Дерево Ван Эмде Боаса (Van Emde Boas tree)

Вставка в дерево vEB(16) элемента 6 (01102)

18

vEB(16) u: 16 min: 2 max: 15

summary cluster[]:

vEB(4) u: 4 min: 0 max: 3

summary cluster[]:

vEB(4) u: 4 min: 3 max: 3

summary cluster[]:

vEB(2)

u: 2

min: -

max: -

vEB(2)

u: 2

min: -

max: -

vEB(2)

u: 2

min: -

max: -

vEB(2)

u: 2

min: 0

max: 1

vEB(2)

u: 2

min: 1

max: 1

vEB(2)

u: 2

min: 1

max: 1

vEB(4) u: 4 min: 2 max: 3

summary cluster[]:

vEB(2)

u: 2

min: 1

max: 1

vEB(2)

u: 2

min: -

max: -

vEB(2)

u: 2

min: 1

max: 1

vEB(4) u: 4 min: - max: -

summary cluster[]:

vEB(2)

u: 2

min: -

max: -

vEB(2)

u: 2

min: -

max: -

vEB(2)

u: 2

min: -

max: -

vEB(4) u: 4 min: 0 max: 3

summary cluster[]:

vEB(2)

u: 2

min: 0

max: 1

vEB(2)

u: 2

min: 1

max: 1

vEB(2)

u: 2

min: 0

max: 1

high(6) = high(0110) = 1 low(6) = low(0110) = 2

vEB_Add(vEB(16), 6)

hi = 1, lo = 2

vEB_Min(vEB(16).cluster[1]) != NULL

vEB_Add(vEB(16).cluster[1], 2)

hi = 1, lo = 0

vEB_Min(vEB(4).cluster[1]) != NULL

vEB_Add(vEB(4).cluster[1], 0)

Обмениваем min=1 и key=0

7

6

Add(vEB(16), 6)1

Add(vEB(4), 2)2

Add(vEB(2), 0) 3

Page 19: Лекция 8: Дерево Ван Эмде Боаса (Van Emde Boas tree)

Удаление элемента из дерева vEB

19

Рекурсивно спускаемся по дереву vEB и ищем узел, которому

соответствует ключ

Если дерево (узел) содержит один элемент (min = max), удаляем min

и max

Если в дереве (узле) 2 элемента (u = 2), удаляем один из них

и корректируем min и max; в дереве остается один элемент и min = max

HOME WORK

Изучить алгоритм удаления элемента из дерева vEB

[CLRS_3ed, C. 554] (English version)

“Deleting an element”

Page 20: Лекция 8: Дерево Ван Эмде Боаса (Van Emde Boas tree)

Эффективность дерева vEB

20

Высота дерева определяется значением u – длинной ключа

При первом вызове Lookup длина ключа log2 𝑢

На втором рекурсивном вызове длина ключа log2 𝑢

2

(в два раза короче – low(key))

На третьем вызове длина ключа: log2 𝑢

22

(в четыре раза короче – low(low(key)))

и т.д. пока не дойдем до узла с u = 2

log2 𝑢

21,

log2 𝑢

22,

log2 𝑢

23, ⋯ ,

log2 𝑢

2𝑘= 1

log2 𝑢 = 2𝑘 ,

𝑘 = log2 log2 𝑢

Дерево vEB(u) имеет высоту 𝑶(𝐥𝐨𝐠𝟐 𝐥𝐨𝐠𝟐 𝒖)

Page 21: Лекция 8: Дерево Ван Эмде Боаса (Van Emde Boas tree)

Дерево Ван Эмде Боаса (Van Emde Boas tree)

2121

ОперацияХудший случай

(worst case)

Add(key, value) 𝑂(log2 log2 𝑢)

Lookup(key) 𝑂(log2 log2 𝑢)

Delete(key) 𝑂(log2 log2 𝑢)

Min 𝑂(1)

Max 𝑂(1)

Сложность по памяти: O(2logu)

u – максимальное значение ключа + 1

Page 22: Лекция 8: Дерево Ван Эмде Боаса (Van Emde Boas tree)

Плюсы и минусы дерева vEB

22

Достоинства дерева vEB

Вычислительная сложность операций 𝑂(log2 log2 𝑢):

а) асимптотически быстрее чем сбалансированные

деревья поиска (AVL tree, red-back tree),

б) сложность операций не зависит от количества n

элементов в дереве (в словаре)

Недостатки

Применимо лишь в случае целых неотрицательных

ключей

Высокие требования к памяти O(u) = O(2logu)

Page 23: Лекция 8: Дерево Ван Эмде Боаса (Van Emde Boas tree)

Применение дерева vEB

23

Словарь (ассоциативный массив) с целочисленными

ключами

Сортировка n целочисленных ключей

за время 𝑂 𝑛 ∙ log2 log2 𝑢 – быстрее чем поразрядная

сортировка (Radix sort)

Реализация кучи и применение в алгоритме Дейкстры

построения кратчайшего пути в графе: реализация

DecreaseKey за время 𝑂 log2 log2 𝑢 , таким образом

итоговое время работы алгоритма Дейкстры составит

𝑂 𝐸 ∙ log2 log2 𝑢

Page 24: Лекция 8: Дерево Ван Эмде Боаса (Van Emde Boas tree)

Задания

24

Прочитать в [CLRS_3ed, С. 551] (English version)

“20.3.2 Operations on a van Emde Boas tree”

Разобраться с функциями удаления, поиска следующего

(Successor) и предыдущего (Predecessor) элементов в vEB