SlideShare a Scribd company logo
Лекция 9Дерево ванЭмдеБоаса(van EmdeBoas tree) 
КурносовМихаил Георгиевич 
E-mail: mkurnosov@gmail.com 
WWW: www.mkurnosov.net 
Курс “Алгоритмы и структуры данных” 
Сибирский государственный университет телекоммуникаций и информатики (Новосибирск) 
Осенний семестр, 2014
Дерево ванЭмдеБоаса(Van EmdeBoas tree) 
2 
Дерево ванЭмдеБоаса(van EmdeBoas tree, vEBtree)– это структура данных, реализующая операции Lookup, Insert, Delete, Min, Max, Successor, Predecessor над динамическими множествами(sets)за времяO(lg(lg(n))) 
Операции ExtractMinи DecreaseKeyмогут быть реализованы на базе операций Min, Delete и Insert
Дерево ванЭмдеБоаса(Van EmdeBoas tree) 
Дерево ванЭмдеБоаса(van EmdeBoas tree, vEBtree)– это дерево поиска (search tree)для хранения целочисленных m-битных ключей 
Ключ –целое неотрицательное число из множества 푈=0,1,…,푢−1,푢=2푚 
Основные операции (Insert, Delete, Lookup, Min, Max) выполняются за время 푂(loglog푢), что асимптотически лучше, чем 푂log푛в сбалансированных бинарных деревьях поиска (AVL tree, red-black tree) 
Автор: Peter van EmdeBoas, 1975 
Peter van EmdeBoas. 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
Дерево ванЭмдеБоаса(Van EmdeBoas tree) 
4 
Дерево ванЭмдеБоаса(van EmdeBoas tree, vEBtree)– это дерево поиска (search tree)для хранения целочисленных неотрицательных ключей из множества {0, 1, …, u–1} 
Например, пусть ключи –это целые числа из множества {0, 1, …, 1000} 
Тогда u= 1000 +1 = 1001(мощность множества ключей) 
Для хранения ключа с максимальным значением 1000 необходимо log21000+1=9.97+1=10бит 
Максимальноезначение ключа 
Количество бит для хранения ключа 
255 
8 (uint8_t) 
65535 
16 (uint16_t) 
4294967295 
32 (uint32_t) 
264–1 
64 (uint64_t)
Прямаяадресация 
5 
Динамическое множество значений из универсума푈=0,1,…,푢−1можно хранить в массиве 퐴[0,..푢−1]из 푢бит 
Элемент 퐴[푥]хранит 1, если значение 푥принадлежит множеству, 0 –в противном случае 
Операции Insert,Delete, Member/Lookup выполняются за время O(1) 
Min, Max, Successor, Predecessor выполняются за времяO(u) – требуется просмотреть весь битовый вектор A 
1 
0 
0 
1 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
1 
0 
0 
1 
18 
3 
2 
Универсум из 3-х элементов 푼=ퟎ,ퟑ,ퟏퟖ,풖=ퟐퟎ 
Successor(0) = 3, Successor(18) = NULL 
Predecessor(18) = 3 
Min 
Max
Наложение бинарного дерева 
6 
Динамическое множество значений из универсума푈=0,1,…,푢−1можно хранить в массиве 퐴[0,..푢−1]из 푢бит 
Элементы битового вектора –это листья бинарного дерева, внутренний узел содержит 1 тогда и только тогда, когда некоторый лист в его поддереве содержит 1 (внутренний узел содержит логическое ИЛИ дочерних узлов) 
푼=ퟐ,ퟑ,ퟒ,ퟓ,ퟕ,ퟏퟒ,ퟏퟓ,풖=ퟏퟔ 
Min–от корня вниз, выбирая самый левый узел с 1 
Max–от корня вправо, выбирая самый правый узел с 1 
Predecessor(x) –от листа к корню, пока не войдем справа в узел с левым дочерним элементом 1, затем вниз, выбирай крайний справа узел с 1 
Высота дерева h= O(log(u)) Сложность операцийMin/Max/Predecessor –O(log(u)) 
Сложность Lookup –O(1)
Наложение деревапостоянной высоты 
7 
푼=ퟐ,ퟑ,ퟒ,ퟓ,ퟕ,ퟏퟒ,ퟏퟓ,풖=ퟏퟔ 
Динамическое множество значений из универсума 푈=0,1,…,푢−1можно хранить в массиве 퐴[0,..푢−1]из 푢бит 
Элементы битового вектора –это листья бинарного дерева, внутренний узел содержит 1 тогда и только тогда, когда некоторый лист в его поддереве содержит 1 (внутренний узел содержит логическое ИЛИ дочерних узлов) 
Можно ли наложить на бинарный вектор дерево постоянной высоты (не зависящей отu)? 
h=O(log(u))
Наложение деревапостоянной высоты 
푼=ퟐ,ퟑ,ퟒ,ퟓ,ퟕ,ퟏퟒ,ퟏퟓ,풖=ퟏퟔ 
Пусть размер универсума푢=22푚, так что 푢=2푚целое число 
Наложим на битовый вектор дерево степени 푢=2푚 
Узлы на уровне 1 –это результат ИЛИ для группы из 푢=4бит 
Узлы на уровне 1 –это элементы массива summary[0..푢−1] 
summary[i] –это логическое ИЛИ подмассива퐴푖푢..푖+1푢−1 
summary[i] –это кластер(cluster)i 
Бит xмассива Aнаходится в кластерес номером 푥/푢 
Дерево степени 16=4 
summary[0] 
summary[3]
Наложение деревапостоянной высоты 
푼=ퟐ,ퟑ,ퟒ,ퟓ,ퟕ,ퟏퟒ,ퟏퟓ,풖=ퟏퟔ 
Insert:A[x] = 1, summary[푥/푢] = 1 O(1) 
Min/Max: ищем крайний слева(справа)элемент summary[i] = 1,затем в кластере iнаходим крайней слева (справа) бит 1O(풖) 
Successor/Predecessor: ищем в пределах кластера вправо (влево) бит 1, если не нашли, то ищем кластер справа (слева) от 푥/푢, который содержит 1 и в нем отыскиваем крайний слева (справа) бит 1O(풖) 
Delete: A[x] = 0, summary[푥/푢] = логическое ИЛИ битов кластера iO(풖) 
summary[0] 
summary[3]
Рекурсивная структура 
푼=ퟐ,ퟑ,ퟒ,ퟓ,ퟕ,ퟏퟒ,ퟏퟓ,풖=ퟏퟔ 
Имеем универсум из 푢элементов 
Создаем структуры хранящие 푢=푢 12элементов, которые хранят структуры по푢 14элементов, которые хранят структуры по 푢 18элементов, … до структур по 2 элемента 
Считаем, что 푢=22푘 , для некоторого целого k 
Тогда u, u1/2, u1/4и т.д. –целые числа 
uиз множества {2, 4, 16, 256, 65536, …} 
summary[0] 
summary[3]
Рекурсивная структура 
푼=ퟐ,ퟑ,ퟒ,ퟓ,ퟕ,ퟏퟒ,ퟏퟓ,풖=ퟏퟔ 
Значение xрасполагается в кластере с номером 푥/푢 
Будем считать, что x –это log2u –битовое число, тогда номер кластера определяется log2(u)/ 2старшими битами числа x 
high푥=푥/푢 
В своем кластереxнаходится в позиции 푥mod푢, которая задается младшими log2(u)/ 2битами x 
low푥=푥mod푢 
indexℎ,푙=ℎ푢+푙 
summary[0] 
summary[3]
ПротоструктураванЭмдеБоаса(proto-vEB) 
12 
Обозначим через proto-vEB(u)протоструктуруванЭмдеБоаса, содержащее ключи из множества {0, 1, …, u–1} 
Каждый узел дерева proto-vEB(u) содержит: 
значение u –размер универсума 
если u= 2 
это базовый размер и структура содержит массив A[0..1] из двух бит 
иначе 
указатель summaryна структуру proto-vEB(푢) 
массив cluster[0..푢−1] указателей на структурыproto-vEB(푢)
ПротоструктураванЭмдеБоаса(proto-vEB) 
13 
U= {2, 3, 4, 5, 7, 14, 15} 
u= 16 
summary–хранит результат (ИЛИ) для родительской структуры
Поиск элемента 
14 
U= {2, 3, 4, 5, 7, 14, 15} 
u= 16 
functionLookup(V, x) 
ifV.u= 2 then 
returnV.A[x] 
node = V.cluster[high(x)] 
returnLookup(node, low(x)) 
end function
Поиск элемента 
15 
U= {2, 3, 4, 5, 7, 14, 15} 
u= 16 
functionLookup(V, x) 
ifV.u= 2 then 
returnV.A[x] 
node = V.cluster[high(x)] 
returnLookup(node, low(x)) 
end function 
Lookup(V, 14) 
high(14) = 3 
low(14) = 2 
Lookup(V, 2) 
high(2) = 1 
low() = 0 
Lookup(V, 0) 
return A[0] 
1410= 11102 
210= 102
Поиск элемента 
16 
U= {2, 3, 4, 5, 7, 14, 15} 
u= 16 
functionLookup(V, x) 
ifV.u= 2 then 
returnV.A[x] 
node = V.cluster[high(x)] 
returnLookup(node, low(x)) 
end function 
Lookup(V, 14) 
high(14) = 3 
low(14) = 2 
1410= 11102 
210= 102 
T(u) = T(풖) + O(1) = O(log(logu)) 
Lookup(V, 2) 
high(2) = 1 
low() = 0 
Lookup(V, 0) 
return A[0]
Структурадерева ванЭмдеБоаса 
17 
Обозначим через 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
Пример дерева vEB(16) 
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: 1 
max: 1 
Дерево vEB(16), содержащее ключи 2, 3, 4, 5, 7, 14, 15 
Данные только в полях min, max
Пример дерева vEB(16) 
19 
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 
7 
5 
11 
01 
00 
10 
1 
0 
3 
4 
14 
Дерево vEB(16), содержащее ключи 2, 3, 4, 5, 7, 14, 15 
Данные только в полях min, max
Структурадерева ванЭмдеБоаса 
20 
Значения(value) ассоциированные с ключами хранятся только в полях min, maxузлов(min.value, max.value) 
Ключ не хранится в узлах (аналогия с trie, prefix tree)– биты ключа распределены по узламна пути от корня к листьям 
Время выполнения операций не зависит от количества nэлементов в дереве 
Хранение min и max в узлах позволяет сократить глубину спуска по дереву при поиске минимального/максимального элемента, а также при поиске следующего элемента (successor) и предыдущего(predecessor)
Структурадерева ванЭмдеБоаса 
21 
В ключе “закодирован”путь в дереве 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 
1 
Key: 
Индекс в cluster[] уровня 0 (корень) 
Индекс в cluster[] уровня 1 
Индекс уровня 2 
high(key) = 101100112 = 17910 
high(x) = 210 
high(x) = 310
Структурадерева ванЭмдеБоаса 
22 
В ключе “закодирован”путь в дереве 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 
1 
Key: 
Индекс в cluster[] уровня 0 (корень) 
Индекс в cluster[] уровня 1 
Индекс уровня 2 
high(key) = 101100112 = 17910 
high(x) = 210 
high(x) = 310 퐥퐨퐠ퟐ풖 ퟐퟏ 퐥퐨퐠ퟐ풖 ퟐퟐ 퐥퐨퐠ퟐ풖 ퟐퟑ 
… 
Размер интервала (подключа) уменьшается по геометрической прогрессии
log2푢 2푘=1, 
log2푢=2푘, 
Структурадерева ванЭмдеБоаса 
23 
В ключе “закодирован”путь в дереве 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 
1 
Key: 퐥퐨퐠ퟐ풖 ퟐퟏ 퐥퐨퐠ퟐ풖 ퟐퟐ 퐥퐨퐠ퟐ풖 ퟐퟑ 
… 
Сколько интервалов (подключей) в исходном ключе? 
Разбиение (спуск) продолжается пока длина интервала не станет ≤ 2 퐥퐨퐠ퟐ풖 ퟐ풌=ퟏ 
풌=퐥퐨퐠(퐥퐨퐠풖)
Структурадерева ванЭмдеБоаса 
24 
Дерево 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 
1 
Key: 
Индекс в cluster[] уровня 0 (корень) 
Индекс в cluster[] уровня 1 
Индекс уровня 2 
high(key) = 101100112 = 17910 
high(x) = 210 
high(x) = 310 
풉풊품풉풙= 풙 ퟐ logퟐ풖 ퟐ 
풍풐풘풙=풙modퟐ logퟐ풖 ퟐ 
Половина старших битов 
Половина младших битов 
ℎ푖푔ℎ45869= 4586928=179 
푙표푤45869=45869mod256=45
Поиск экстремальных(min/max)элементов 
25 
functionvEB_Min(tree) 
returntree.min 
end function 
functionvEB_Max(tree) 
returntree.max 
end function 
Вместе с деревом хранятся минимальныйи максимальный элементы, доступ к ним осуществляется за время O(1) 
TMin= O(1) 
TMax= O(1)
Поиск элемента в дереве vEB 
26 
functionvEB_Lookup(tree, key) 
ifkey = tree.min.keythen 
returntree.min 
ifkey = tree.max.keythen 
returntree.max 
// Дерево vEB(2) данных кроме min, max не имеет 
iftree.u= 2 
returnNULL 
hi = high(key) // Номер поддеревав cluster[] 
lo = low(key)// Новый ключ 
returnvEB_Lookup(tree.cluster[hi], lo) 
end function 
TLookup= O(log(logu)) 
Рекурсивно спускаемся по дереву проверяя поля min и max 
С каждым рекурсивным вызовом длина ключа keyуменьшается: 
key -> low(key) -> low(low(key)) -> low(low(low(key))) -> …
Поиск в дереве vEB(16)элемента 7 (01112) 
27 
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
Добавление элемента в пустое дерево vEB 
28 
functionvEB_AddEmpty(tree, key, value) 
// Дерево пусто–заполняем поля min, max 
tree.min.key= key 
tree.min.value= value 
tree.max.key= key 
tree.max.value= value 
end function 
TAddEmpty= O(1) 
При вставке элемента в пустое дерево, заносим его в поля min и max 
После вставки в дереве один элемент и min = max
Добавление элемента в дерево vEB 
29 
functionvEB_Add(tree, key, value) 
iftree.min= NULL then 
// Дерево пусто 
vEB_AddEmpty(tree, key, value) 
end if 
if key < tree.min.keythen 
// Заменим minновым значением, а старый min 
// добавим в поддерево 
swap(<min.key, min.value>, <key, value>) 
end if 
Добавление элемента в дерево выполняется рекурсивно, при каждом вызове (для каждого поддерева) обрабатываем возможные ситуации: 
Если поддерево пусто, добавляем элемент в поля min и max 
Если ключ меньше ключа min, заменяем в minключ на новый, астарый ключ min вставим в поддерево позднее (см. ниже)
Добавление элемента в дерево vEB 
30 
iftree.u> 2 then 
hi = high(key) 
lo = low(key) 
ifvEB_Min(tree.cluster[hi]) = NULL then 
// Поддерево hi пусто 
vEB_Add(tree.summary, hi) 
vEB_AddEmpty(tree.cluster[hi], lo) 
else 
vEB_Add(tree.cluster[hi], lo) 
end if 
ifkey > tree.max.keythen 
// Обновляем max 
tree.max.key= key 
tree.max.value= value 
end if 
end function 
Рекурсивно спускаемся пока, не дойдем до узла с u≤ 2 
TAdd= O(log(log(u)))
Вставка в дерево vEB(16)элемента 6 (01102) 
31 
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
Удаление элемента из дерева vEB 
32 
Рекурсивно спускаемся по дереву vEBи ищем узел, которому соответствует ключ 
Если дерево(узел) содержит один элемент (min = max), удаляем min и max 
Если в дереве (узле) 2 элемента (u= 2), удаляем один из них и корректируем min и max;в дереве остается один элементи min = max 
… 
HOME WORK 
Изучить алгоритм удаления элемента из дерева vEB 
[CLRS_3ed, C.590]“Удаление элемента”
Эффективность дерева vEB 
33 
Высота дерева определяется значением u–длинной ключа 
При первомвызове Lookup длина ключа log2푢 
На второмрекурсивном вызове длина ключа log2푢 2(в два раза короче –low(key)) 
На третьемвызове длина ключа: log2푢 22(в четыре раза короче –low(low(key))) 
и т.д. пока не дойдем до узла с u= 2log2푢 21, log2푢 22, log2푢 23,⋯, log2푢 2푘=1 
log2푢=2푘, 
푘=log2log2푢 
Дерево vEB(u) имеет высоту푶(퐥퐨퐠ퟐ퐥퐨퐠ퟐ풖)
Дерево ванЭмдеБоаса(van EmdeBoas tree) 
34 
Операция 
Худший случай (worst case) 
Add(key,value) 
푂(log2log2푢) 
Lookup(key) 
푂(log2log2푢) 
Delete(key) 
푂(log2log2푢) 
Min 
푂(1) 
Max 
푂(1) 
Сложность по памяти: O(2logu)= O(u) 
u–максимальное значение ключа + 1
Плюсы и минусы дерева vEB 
35 
Достоинства дерева vEB 
Вычислительная сложность операций 푂(log2log2푢): 
асимптотически быстрее чем сбалансированные деревья поиска (AVL tree, red-back tree) 
сложность операций не зависит от количества nэлементов в дереве (в словаре) 
Недостатки 
Применимо лишь в случае целых неотрицательных ключей 
Высокие требования к памяти O(u) = O(2logu)
Применение дерева vEB 
36 
Словарь(ассоциативный массив) с целочисленными ключами 
Сортировкаnцелочисленных ключейза время 푂푛∙log2log2푢–быстрее чем поразрядная сортировка(Radix sort) 
Реализация кучии применение в алгоритме Дейкстрыпостроения кратчайшего пути в графе: реализация DecreaseKeyза время 푂log2log2푢, таким образом итоговое время работы алгоритма Дейкстрысоставит 푂퐸∙log2log2푢
Задания 
37 
Изучить алгоритм удаления элемента из дерева vEB[CLRS_3ed, C.590]“Удаление элемента” 
Разобраться с функциями удаления, поиска следующего(Successor)и предыдущего(Predecessor)элементов в vEB

More Related Content

PDF
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
PDF
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
PDF
Лекция 5. B-деревья (B-trees, k-way merge sort)
PDF
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
PDF
Лекция 8: Дерево Ван Эмде Боаса (Van Emde Boas tree)
PDF
Лекция 3. АВЛ-деревья (AVL trees)
PDF
Лекция 10. Биномиальные кучи (Binomial heaps)
PDF
Лекция 5. Бинарные деревья поиска
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 5. B-деревья (B-trees, k-way merge sort)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 8: Дерево Ван Эмде Боаса (Van Emde Boas tree)
Лекция 3. АВЛ-деревья (AVL trees)
Лекция 10. Биномиальные кучи (Binomial heaps)
Лекция 5. Бинарные деревья поиска

What's hot (20)

PDF
Лекция 3. АВЛ-деревья (AVL trees)
PDF
Лекция 6: Биномиальные кучи (Binomial heaps)
PDF
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
PDF
Лекция 4. Префиксные деревья (tries, prefix trees)
PDF
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
PDF
Лекция 5. B-деревья (B-trees, k-way merge sort)
PDF
Лекция 4: Префиксные деревья (Tries, prefix trees)
PDF
Лекция 2: АВЛ-деревья (AVL trees)
PDF
Лекция 3: Бинарный поиск. Связные списки
PDF
Лекция 9: Декартовы деревья (Treaps, дучи, дерамиды)
PDF
Лекция 4. Префиксные деревья (Tries, prefix trees)
PDF
Лекция 11. Деревья отрезков (Interval trees)
PDF
Лекция 5: Бинарные деревья поиска
PDF
Лекция 5: B-деревья (B-trees, k-way merge sort)
PDF
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
PDF
Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)
PDF
Лекция 3: Бинарный поиск. Связные списки
PDF
Лекция 7. Бинарные кучи. Пирамидальная сортировка
PDF
Лекция 5: Словари. Бинарные деревья поиска
PDF
Лекция 2. Алгоритмы сортировки
Лекция 3. АВЛ-деревья (AVL trees)
Лекция 6: Биномиальные кучи (Binomial heaps)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 5. B-деревья (B-trees, k-way merge sort)
Лекция 4: Префиксные деревья (Tries, prefix trees)
Лекция 2: АВЛ-деревья (AVL trees)
Лекция 3: Бинарный поиск. Связные списки
Лекция 9: Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 4. Префиксные деревья (Tries, prefix trees)
Лекция 11. Деревья отрезков (Interval trees)
Лекция 5: Бинарные деревья поиска
Лекция 5: B-деревья (B-trees, k-way merge sort)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)
Лекция 3: Бинарный поиск. Связные списки
Лекция 7. Бинарные кучи. Пирамидальная сортировка
Лекция 5: Словари. Бинарные деревья поиска
Лекция 2. Алгоритмы сортировки
Ad

Viewers also liked (15)

PDF
Лекция 4. Стеки и очереди
PDF
Лекция 8. Деревья разбиения пространства (BSP tree, k-d tree, quadtree)
PDF
Лекция 10: Графы. Остовные деревья минимальной стоимости
PDF
Семинар 10. Параллельное программирование на MPI (часть 3)
PDF
Лекция 12: Трудноразрешимые задачи
PDF
Семинар 12. Параллельное программирование на MPI (часть 5)
PDF
Лекция 9. Поиск кратчайшего пути в графе
PDF
Лекция 10. Графы. Остовные деревья минимальной стоимости
PDF
Лекция 1. Амортизационный анализ (Amortized analysis)
PDF
Лекция 11: Методы разработки алгоритмов
PDF
Лекция 12. Вероятностный анализ и рандомизированные алгоритмы (Randomized al...
PDF
Лекция 1. Амортизационный анализ (amortized analysis)
PDF
Лекция 8. Графы. Обходы графов
PDF
Лекция 6. Хеш-таблицы
PDF
Лекция 11. Методы разработки алгоритмов
Лекция 4. Стеки и очереди
Лекция 8. Деревья разбиения пространства (BSP tree, k-d tree, quadtree)
Лекция 10: Графы. Остовные деревья минимальной стоимости
Семинар 10. Параллельное программирование на MPI (часть 3)
Лекция 12: Трудноразрешимые задачи
Семинар 12. Параллельное программирование на MPI (часть 5)
Лекция 9. Поиск кратчайшего пути в графе
Лекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 1. Амортизационный анализ (Amortized analysis)
Лекция 11: Методы разработки алгоритмов
Лекция 12. Вероятностный анализ и рандомизированные алгоритмы (Randomized al...
Лекция 1. Амортизационный анализ (amortized analysis)
Лекция 8. Графы. Обходы графов
Лекция 6. Хеш-таблицы
Лекция 11. Методы разработки алгоритмов
Ad

Similar to Лекция 9. Дерево ван Эмде Боаса (van Emde Boas tree) (20)

PPT
03 двоичные деревья поиска и очередь с приоритетами
PDF
Алгоритмы и структуры данных осень 2013 лекция 6
PPT
Лекция 5 Элементарные структуры данных часть 3
PPT
Лекция 6 Элементарные структуры данных часть 4
PDF
Лекция 3: Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
PDF
Алгоритмы и структуры данных осень 2013 лекция 5
PDF
27 - Базы данных. Общее понятие индексирования
PDF
Лекция №6. Деревья. Предмет "Структуры и алгоритмы обработки данных"
PDF
Multidimensional indexing
PPTX
Алгоритмы и структуры данных весна 2014 лекция 1
PPT
практика 13
PDF
Лекция №13. Графы: сильно связные компоненты и остовные деревья. Предмет "Стр...
PPT
PDF
Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки да...
PPTX
АиСД осень 2012 лекция 10
PDF
ITMO RecSys course. Autumn 2014. Lecture 3
PDF
Лекция №11. Работа с внешней памятью (файлами). Предмет "Структуры и алгоритм...
PPT
D-кучи и их применение
PPT
лекция 13
PPT
Лекция 7 Элементарные структуры данных часть 5
03 двоичные деревья поиска и очередь с приоритетами
Алгоритмы и структуры данных осень 2013 лекция 6
Лекция 5 Элементарные структуры данных часть 3
Лекция 6 Элементарные структуры данных часть 4
Лекция 3: Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Алгоритмы и структуры данных осень 2013 лекция 5
27 - Базы данных. Общее понятие индексирования
Лекция №6. Деревья. Предмет "Структуры и алгоритмы обработки данных"
Multidimensional indexing
Алгоритмы и структуры данных весна 2014 лекция 1
практика 13
Лекция №13. Графы: сильно связные компоненты и остовные деревья. Предмет "Стр...
Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки да...
АиСД осень 2012 лекция 10
ITMO RecSys course. Autumn 2014. Lecture 3
Лекция №11. Работа с внешней памятью (файлами). Предмет "Структуры и алгоритм...
D-кучи и их применение
лекция 13
Лекция 7 Элементарные структуры данных часть 5

More from Mikhail Kurnosov (15)

PDF
Векторизация кода (семинар 2)
PDF
Векторизация кода (семинар 3)
PDF
Векторизация кода (семинар 1)
PDF
Лекция 7. Стандарт OpenMP (подолжение)
PDF
Лекция 6. Стандарт OpenMP
PDF
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
PDF
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
PDF
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
PDF
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
PDF
Семинар 11. Параллельное программирование на MPI (часть 4)
PDF
Семинар 9. Параллельное программирование на MPI (часть 2)
PDF
Семинар 8. Параллельное программирование на MPI (часть 1)
PDF
Семинар 7. Многопоточное программирование на OpenMP (часть 7)
PDF
Семинар 6. Многопоточное программирование на OpenMP (часть 6)
PDF
Семинар 5. Многопоточное программирование на OpenMP (часть 5)
Векторизация кода (семинар 2)
Векторизация кода (семинар 3)
Векторизация кода (семинар 1)
Лекция 7. Стандарт OpenMP (подолжение)
Лекция 6. Стандарт OpenMP
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 9. Параллельное программирование на MPI (часть 2)
Семинар 8. Параллельное программирование на MPI (часть 1)
Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Семинар 6. Многопоточное программирование на OpenMP (часть 6)
Семинар 5. Многопоточное программирование на OpenMP (часть 5)

Лекция 9. Дерево ван Эмде Боаса (van Emde Boas tree)

  • 1. Лекция 9Дерево ванЭмдеБоаса(van EmdeBoas tree) КурносовМихаил Георгиевич E-mail: mkurnosov@gmail.com WWW: www.mkurnosov.net Курс “Алгоритмы и структуры данных” Сибирский государственный университет телекоммуникаций и информатики (Новосибирск) Осенний семестр, 2014
  • 2. Дерево ванЭмдеБоаса(Van EmdeBoas tree) 2 Дерево ванЭмдеБоаса(van EmdeBoas tree, vEBtree)– это структура данных, реализующая операции Lookup, Insert, Delete, Min, Max, Successor, Predecessor над динамическими множествами(sets)за времяO(lg(lg(n))) Операции ExtractMinи DecreaseKeyмогут быть реализованы на базе операций Min, Delete и Insert
  • 3. Дерево ванЭмдеБоаса(Van EmdeBoas tree) Дерево ванЭмдеБоаса(van EmdeBoas tree, vEBtree)– это дерево поиска (search tree)для хранения целочисленных m-битных ключей Ключ –целое неотрицательное число из множества 푈=0,1,…,푢−1,푢=2푚 Основные операции (Insert, Delete, Lookup, Min, Max) выполняются за время 푂(loglog푢), что асимптотически лучше, чем 푂log푛в сбалансированных бинарных деревьях поиска (AVL tree, red-black tree) Автор: Peter van EmdeBoas, 1975 Peter van EmdeBoas. 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
  • 4. Дерево ванЭмдеБоаса(Van EmdeBoas tree) 4 Дерево ванЭмдеБоаса(van EmdeBoas tree, vEBtree)– это дерево поиска (search tree)для хранения целочисленных неотрицательных ключей из множества {0, 1, …, u–1} Например, пусть ключи –это целые числа из множества {0, 1, …, 1000} Тогда u= 1000 +1 = 1001(мощность множества ключей) Для хранения ключа с максимальным значением 1000 необходимо log21000+1=9.97+1=10бит Максимальноезначение ключа Количество бит для хранения ключа 255 8 (uint8_t) 65535 16 (uint16_t) 4294967295 32 (uint32_t) 264–1 64 (uint64_t)
  • 5. Прямаяадресация 5 Динамическое множество значений из универсума푈=0,1,…,푢−1можно хранить в массиве 퐴[0,..푢−1]из 푢бит Элемент 퐴[푥]хранит 1, если значение 푥принадлежит множеству, 0 –в противном случае Операции Insert,Delete, Member/Lookup выполняются за время O(1) Min, Max, Successor, Predecessor выполняются за времяO(u) – требуется просмотреть весь битовый вектор A 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 18 3 2 Универсум из 3-х элементов 푼=ퟎ,ퟑ,ퟏퟖ,풖=ퟐퟎ Successor(0) = 3, Successor(18) = NULL Predecessor(18) = 3 Min Max
  • 6. Наложение бинарного дерева 6 Динамическое множество значений из универсума푈=0,1,…,푢−1можно хранить в массиве 퐴[0,..푢−1]из 푢бит Элементы битового вектора –это листья бинарного дерева, внутренний узел содержит 1 тогда и только тогда, когда некоторый лист в его поддереве содержит 1 (внутренний узел содержит логическое ИЛИ дочерних узлов) 푼=ퟐ,ퟑ,ퟒ,ퟓ,ퟕ,ퟏퟒ,ퟏퟓ,풖=ퟏퟔ Min–от корня вниз, выбирая самый левый узел с 1 Max–от корня вправо, выбирая самый правый узел с 1 Predecessor(x) –от листа к корню, пока не войдем справа в узел с левым дочерним элементом 1, затем вниз, выбирай крайний справа узел с 1 Высота дерева h= O(log(u)) Сложность операцийMin/Max/Predecessor –O(log(u)) Сложность Lookup –O(1)
  • 7. Наложение деревапостоянной высоты 7 푼=ퟐ,ퟑ,ퟒ,ퟓ,ퟕ,ퟏퟒ,ퟏퟓ,풖=ퟏퟔ Динамическое множество значений из универсума 푈=0,1,…,푢−1можно хранить в массиве 퐴[0,..푢−1]из 푢бит Элементы битового вектора –это листья бинарного дерева, внутренний узел содержит 1 тогда и только тогда, когда некоторый лист в его поддереве содержит 1 (внутренний узел содержит логическое ИЛИ дочерних узлов) Можно ли наложить на бинарный вектор дерево постоянной высоты (не зависящей отu)? h=O(log(u))
  • 8. Наложение деревапостоянной высоты 푼=ퟐ,ퟑ,ퟒ,ퟓ,ퟕ,ퟏퟒ,ퟏퟓ,풖=ퟏퟔ Пусть размер универсума푢=22푚, так что 푢=2푚целое число Наложим на битовый вектор дерево степени 푢=2푚 Узлы на уровне 1 –это результат ИЛИ для группы из 푢=4бит Узлы на уровне 1 –это элементы массива summary[0..푢−1] summary[i] –это логическое ИЛИ подмассива퐴푖푢..푖+1푢−1 summary[i] –это кластер(cluster)i Бит xмассива Aнаходится в кластерес номером 푥/푢 Дерево степени 16=4 summary[0] summary[3]
  • 9. Наложение деревапостоянной высоты 푼=ퟐ,ퟑ,ퟒ,ퟓ,ퟕ,ퟏퟒ,ퟏퟓ,풖=ퟏퟔ Insert:A[x] = 1, summary[푥/푢] = 1 O(1) Min/Max: ищем крайний слева(справа)элемент summary[i] = 1,затем в кластере iнаходим крайней слева (справа) бит 1O(풖) Successor/Predecessor: ищем в пределах кластера вправо (влево) бит 1, если не нашли, то ищем кластер справа (слева) от 푥/푢, который содержит 1 и в нем отыскиваем крайний слева (справа) бит 1O(풖) Delete: A[x] = 0, summary[푥/푢] = логическое ИЛИ битов кластера iO(풖) summary[0] summary[3]
  • 10. Рекурсивная структура 푼=ퟐ,ퟑ,ퟒ,ퟓ,ퟕ,ퟏퟒ,ퟏퟓ,풖=ퟏퟔ Имеем универсум из 푢элементов Создаем структуры хранящие 푢=푢 12элементов, которые хранят структуры по푢 14элементов, которые хранят структуры по 푢 18элементов, … до структур по 2 элемента Считаем, что 푢=22푘 , для некоторого целого k Тогда u, u1/2, u1/4и т.д. –целые числа uиз множества {2, 4, 16, 256, 65536, …} summary[0] summary[3]
  • 11. Рекурсивная структура 푼=ퟐ,ퟑ,ퟒ,ퟓ,ퟕ,ퟏퟒ,ퟏퟓ,풖=ퟏퟔ Значение xрасполагается в кластере с номером 푥/푢 Будем считать, что x –это log2u –битовое число, тогда номер кластера определяется log2(u)/ 2старшими битами числа x high푥=푥/푢 В своем кластереxнаходится в позиции 푥mod푢, которая задается младшими log2(u)/ 2битами x low푥=푥mod푢 indexℎ,푙=ℎ푢+푙 summary[0] summary[3]
  • 12. ПротоструктураванЭмдеБоаса(proto-vEB) 12 Обозначим через proto-vEB(u)протоструктуруванЭмдеБоаса, содержащее ключи из множества {0, 1, …, u–1} Каждый узел дерева proto-vEB(u) содержит: значение u –размер универсума если u= 2 это базовый размер и структура содержит массив A[0..1] из двух бит иначе указатель summaryна структуру proto-vEB(푢) массив cluster[0..푢−1] указателей на структурыproto-vEB(푢)
  • 13. ПротоструктураванЭмдеБоаса(proto-vEB) 13 U= {2, 3, 4, 5, 7, 14, 15} u= 16 summary–хранит результат (ИЛИ) для родительской структуры
  • 14. Поиск элемента 14 U= {2, 3, 4, 5, 7, 14, 15} u= 16 functionLookup(V, x) ifV.u= 2 then returnV.A[x] node = V.cluster[high(x)] returnLookup(node, low(x)) end function
  • 15. Поиск элемента 15 U= {2, 3, 4, 5, 7, 14, 15} u= 16 functionLookup(V, x) ifV.u= 2 then returnV.A[x] node = V.cluster[high(x)] returnLookup(node, low(x)) end function Lookup(V, 14) high(14) = 3 low(14) = 2 Lookup(V, 2) high(2) = 1 low() = 0 Lookup(V, 0) return A[0] 1410= 11102 210= 102
  • 16. Поиск элемента 16 U= {2, 3, 4, 5, 7, 14, 15} u= 16 functionLookup(V, x) ifV.u= 2 then returnV.A[x] node = V.cluster[high(x)] returnLookup(node, low(x)) end function Lookup(V, 14) high(14) = 3 low(14) = 2 1410= 11102 210= 102 T(u) = T(풖) + O(1) = O(log(logu)) Lookup(V, 2) high(2) = 1 low() = 0 Lookup(V, 0) return A[0]
  • 17. Структурадерева ванЭмдеБоаса 17 Обозначим через 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
  • 18. Пример дерева vEB(16) 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: 1 max: 1 Дерево vEB(16), содержащее ключи 2, 3, 4, 5, 7, 14, 15 Данные только в полях min, max
  • 19. Пример дерева vEB(16) 19 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 7 5 11 01 00 10 1 0 3 4 14 Дерево vEB(16), содержащее ключи 2, 3, 4, 5, 7, 14, 15 Данные только в полях min, max
  • 20. Структурадерева ванЭмдеБоаса 20 Значения(value) ассоциированные с ключами хранятся только в полях min, maxузлов(min.value, max.value) Ключ не хранится в узлах (аналогия с trie, prefix tree)– биты ключа распределены по узламна пути от корня к листьям Время выполнения операций не зависит от количества nэлементов в дереве Хранение min и max в узлах позволяет сократить глубину спуска по дереву при поиске минимального/максимального элемента, а также при поиске следующего элемента (successor) и предыдущего(predecessor)
  • 21. Структурадерева ванЭмдеБоаса 21 В ключе “закодирован”путь в дереве 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 1 Key: Индекс в cluster[] уровня 0 (корень) Индекс в cluster[] уровня 1 Индекс уровня 2 high(key) = 101100112 = 17910 high(x) = 210 high(x) = 310
  • 22. Структурадерева ванЭмдеБоаса 22 В ключе “закодирован”путь в дереве 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 1 Key: Индекс в cluster[] уровня 0 (корень) Индекс в cluster[] уровня 1 Индекс уровня 2 high(key) = 101100112 = 17910 high(x) = 210 high(x) = 310 퐥퐨퐠ퟐ풖 ퟐퟏ 퐥퐨퐠ퟐ풖 ퟐퟐ 퐥퐨퐠ퟐ풖 ퟐퟑ … Размер интервала (подключа) уменьшается по геометрической прогрессии
  • 23. log2푢 2푘=1, log2푢=2푘, Структурадерева ванЭмдеБоаса 23 В ключе “закодирован”путь в дереве 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 1 Key: 퐥퐨퐠ퟐ풖 ퟐퟏ 퐥퐨퐠ퟐ풖 ퟐퟐ 퐥퐨퐠ퟐ풖 ퟐퟑ … Сколько интервалов (подключей) в исходном ключе? Разбиение (спуск) продолжается пока длина интервала не станет ≤ 2 퐥퐨퐠ퟐ풖 ퟐ풌=ퟏ 풌=퐥퐨퐠(퐥퐨퐠풖)
  • 24. Структурадерева ванЭмдеБоаса 24 Дерево 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 1 Key: Индекс в cluster[] уровня 0 (корень) Индекс в cluster[] уровня 1 Индекс уровня 2 high(key) = 101100112 = 17910 high(x) = 210 high(x) = 310 풉풊품풉풙= 풙 ퟐ logퟐ풖 ퟐ 풍풐풘풙=풙modퟐ logퟐ풖 ퟐ Половина старших битов Половина младших битов ℎ푖푔ℎ45869= 4586928=179 푙표푤45869=45869mod256=45
  • 25. Поиск экстремальных(min/max)элементов 25 functionvEB_Min(tree) returntree.min end function functionvEB_Max(tree) returntree.max end function Вместе с деревом хранятся минимальныйи максимальный элементы, доступ к ним осуществляется за время O(1) TMin= O(1) TMax= O(1)
  • 26. Поиск элемента в дереве vEB 26 functionvEB_Lookup(tree, key) ifkey = tree.min.keythen returntree.min ifkey = tree.max.keythen returntree.max // Дерево vEB(2) данных кроме min, max не имеет iftree.u= 2 returnNULL hi = high(key) // Номер поддеревав cluster[] lo = low(key)// Новый ключ returnvEB_Lookup(tree.cluster[hi], lo) end function TLookup= O(log(logu)) Рекурсивно спускаемся по дереву проверяя поля min и max С каждым рекурсивным вызовом длина ключа keyуменьшается: key -> low(key) -> low(low(key)) -> low(low(low(key))) -> …
  • 27. Поиск в дереве vEB(16)элемента 7 (01112) 27 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
  • 28. Добавление элемента в пустое дерево vEB 28 functionvEB_AddEmpty(tree, key, value) // Дерево пусто–заполняем поля min, max tree.min.key= key tree.min.value= value tree.max.key= key tree.max.value= value end function TAddEmpty= O(1) При вставке элемента в пустое дерево, заносим его в поля min и max После вставки в дереве один элемент и min = max
  • 29. Добавление элемента в дерево vEB 29 functionvEB_Add(tree, key, value) iftree.min= NULL then // Дерево пусто vEB_AddEmpty(tree, key, value) end if if key < tree.min.keythen // Заменим minновым значением, а старый min // добавим в поддерево swap(<min.key, min.value>, <key, value>) end if Добавление элемента в дерево выполняется рекурсивно, при каждом вызове (для каждого поддерева) обрабатываем возможные ситуации: Если поддерево пусто, добавляем элемент в поля min и max Если ключ меньше ключа min, заменяем в minключ на новый, астарый ключ min вставим в поддерево позднее (см. ниже)
  • 30. Добавление элемента в дерево vEB 30 iftree.u> 2 then hi = high(key) lo = low(key) ifvEB_Min(tree.cluster[hi]) = NULL then // Поддерево hi пусто vEB_Add(tree.summary, hi) vEB_AddEmpty(tree.cluster[hi], lo) else vEB_Add(tree.cluster[hi], lo) end if ifkey > tree.max.keythen // Обновляем max tree.max.key= key tree.max.value= value end if end function Рекурсивно спускаемся пока, не дойдем до узла с u≤ 2 TAdd= O(log(log(u)))
  • 31. Вставка в дерево vEB(16)элемента 6 (01102) 31 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
  • 32. Удаление элемента из дерева vEB 32 Рекурсивно спускаемся по дереву vEBи ищем узел, которому соответствует ключ Если дерево(узел) содержит один элемент (min = max), удаляем min и max Если в дереве (узле) 2 элемента (u= 2), удаляем один из них и корректируем min и max;в дереве остается один элементи min = max … HOME WORK Изучить алгоритм удаления элемента из дерева vEB [CLRS_3ed, C.590]“Удаление элемента”
  • 33. Эффективность дерева vEB 33 Высота дерева определяется значением u–длинной ключа При первомвызове Lookup длина ключа log2푢 На второмрекурсивном вызове длина ключа log2푢 2(в два раза короче –low(key)) На третьемвызове длина ключа: log2푢 22(в четыре раза короче –low(low(key))) и т.д. пока не дойдем до узла с u= 2log2푢 21, log2푢 22, log2푢 23,⋯, log2푢 2푘=1 log2푢=2푘, 푘=log2log2푢 Дерево vEB(u) имеет высоту푶(퐥퐨퐠ퟐ퐥퐨퐠ퟐ풖)
  • 34. Дерево ванЭмдеБоаса(van EmdeBoas tree) 34 Операция Худший случай (worst case) Add(key,value) 푂(log2log2푢) Lookup(key) 푂(log2log2푢) Delete(key) 푂(log2log2푢) Min 푂(1) Max 푂(1) Сложность по памяти: O(2logu)= O(u) u–максимальное значение ключа + 1
  • 35. Плюсы и минусы дерева vEB 35 Достоинства дерева vEB Вычислительная сложность операций 푂(log2log2푢): асимптотически быстрее чем сбалансированные деревья поиска (AVL tree, red-back tree) сложность операций не зависит от количества nэлементов в дереве (в словаре) Недостатки Применимо лишь в случае целых неотрицательных ключей Высокие требования к памяти O(u) = O(2logu)
  • 36. Применение дерева vEB 36 Словарь(ассоциативный массив) с целочисленными ключами Сортировкаnцелочисленных ключейза время 푂푛∙log2log2푢–быстрее чем поразрядная сортировка(Radix sort) Реализация кучии применение в алгоритме Дейкстрыпостроения кратчайшего пути в графе: реализация DecreaseKeyза время 푂log2log2푢, таким образом итоговое время работы алгоритма Дейкстрысоставит 푂퐸∙log2log2푢
  • 37. Задания 37 Изучить алгоритм удаления элемента из дерева vEB[CLRS_3ed, C.590]“Удаление элемента” Разобраться с функциями удаления, поиска следующего(Successor)и предыдущего(Predecessor)элементов в vEB