SlideShare a Scribd company logo
1 of 22
Download to read offline
Лекция 7
Декартовы деревья
(treaps)
Курносов Михаил Георгиевич
E-mail: mkurnosov@gmail.com
WWW: www.mkurnosov.net
Курс «Структуры и алгоритмы обработки данных»
Сибирский государственный университет телекоммуникаций и информатики (Новосибирск)
Осенний семестр, 2015
Двоичные деревья поиска (Binary Search Trees)
2
1
Value1
2
Value2
1. Операции над BST имеют трудоемкость
пропорциональную высоте дерева O(h)
2. В среднем случае высота h бинарного
дерева поиска O(logn)
3. В худшем случае элементы добавляются
по возрастанию (убыванию) ключей –
дерево вырождается в список длины n
bstree_add(1, value1)
bstree_add(2, value2)
bstree_add(3, value3)
bstree_add(4, value4)
3
Value3
4
Value4
NULL
NULL
NULL
В худшем случае бинарное дерево поиска
имеет высоту O(n)
Декартово дерево (Treap)
3
 Декартово дерево (Treap) – это структура данных для
реализации словаря, объединяющая в себе бинарное
дерево поиска и бинарную кучу
 Происхождение названия: treap = tree + heap
 Русскоязычный аналог названия:
дуча = дерево + куча, дерамида = дерево + пирамида
 Авторы: Сидель Раймунд (Seidel Raimund),
Цецилия Арагон (Aragon Cecilia), 1989
 Aragon Cecilia R., Seidel Raimund. Randomized Search Trees //
Proc. of 30th Symp. Foundations of Computer Science
(IEEE Computer Society Press), 1989, pp. 540-545
 Seidel Raimund, Aragon Cecilia R. Randomized Search Trees //
Algorithmica. – 1996. – 16 (4/5). – pp. 464–497
Декартово дерево (Treap)
4
 Каждый узел декартова дерева (treap) содержит:
 пару (x, y)
x – ключ бинарного дерева поиска,
y – приоритет бинарной кучи
 указатель left на левое поддерево
 указатель right на правое поддерево
 Предполагается, что все x и y различны
(x0, y0)
(xL, yL) (xR, yR)
(1) Свойства
дерева поиска:
xL < x0 < xR
(2) Свойства
бинарной кучи:
y0 < yL
y0 < yR
Пример декартова дерева
5
C
5
B
10
D
14
K
3
Z
4
Пример декартова дерева:
ключи дерева поиска – буквы алфавита,
приоритет кучи (min-heap) – числа
Операции декартова дерева
6
Операция
Средний случай
(average case)
Худший случай
(worst case)
Lookup(x) 𝑂(log 𝑛) Amortized 𝑂(log 𝑛)
Insert(x,value) 𝑂(log 𝑛) Amortized 𝑂(log 𝑛)
Delete(x) 𝑂(log 𝑛) Amortized 𝑂(log 𝑛)
Split(x) 𝑂(log 𝑛) 𝑂(𝑛)
Merge(T1, T2) 𝑂(log 𝑛) 𝑂(𝑛)
 Сложность по памяти 𝑂(𝑛)
Поиск элемента в декартовом дереве
7
TLookup = O(log(logu))
function TreapLookup(treap, x)
while treap != NULL do
if x = treap.x then
return treap;
else if x < treap.x then
treap = treap.left
else
treap = treap.right
end if
end while
return NULL;
end function
 При поиске элемента приоритет y игнорируется, учитываются только
ключи x – как в обычном бинарном дереве поиска
 В худшем случае спуск по дереву осуществляется до листа –
выполняется порядка O(h) сравнений
TLookup = O(h) = O(n)
Разбиение декартова дерева (Split)
8
 Операция Split(T, x) разбивает декартово дерево на два
дерева T1 и T2
 В дереве T1 находятся узлы с ключами node.x ≤ x
 В дереве T2 находятся узлы с ключами node.x > x
C
5
B
10
D
14
K
3
Z
4
Split(T, E)
T1
T2
Разбиение декартова дерева (Split)
9
 Случай 1: ключ разбиения x > root.x (ключ в корне)
 Левое поддерево T1 совпадает с левым поддеревом
корня T
 Для нахождения правого поддерева T1 необходимо разбить
правое поддерево T по ключу x на T1R и T2R и взять T1R
 Дерево T2 совпадает с деревом T2R
L R
T
(root.x)
L
T1
T2Split(T, x)
x > root.x
T1R
T2R
Разбиение декартова дерева (Split)
10
 Случай 2 (симметричный): ключ разбиения x < root.x
 Правое поддерево T2 совпадает с правым поддеревом
корня T
 Для нахождения левого поддерева T2 необходимо разбить
левое поддерево T по ключу x на T1L и T2L и взять T2L
 Дерево T1 совпадает с деревом T1L
L R
T
(root.x)
T1
Split(T, x)
x < root.x
R
T2
T2L
T1L
Разбиение декартова дерева (Split)
11
TLookup = O(log(logu))
function TreapSplit(treap, x, &treap1, &treap2)
if treap = NULL then
treap1 = treap2 = NULL
else if x > treap.x then
TreapSplit(treap.right, x, treap.right, treap2)
treap1 = treap
else
TreapSplit(treap.left, x, treap1, treap.left)
treap2 = treap
end if
end function
 В худшем случае требуется спуск по дереву до листа –
выполняется порядка O(h) разбиений
TSplit = O(h) = O(n)
Слияние декартовых деревьев (Merge)
 Операция Merge(T1, T2) сливает два декартовых дерева T1 и T2
в новое дерево T (причем все ключи x дерева T2 должны быть
больше ключей x дерева T1)
 Случай 1: Приоритет y корня T1 > приоритета y корня T2
 Корень дерева T1 становится корнем T
 Левое поддерево T1 становится левым поддеревом T
 Правое поддерево T – это объединение правого поддерева T1
и дерева T2
L R
T1
(T1.root.y)
Merge(T1, T2, T)
T1.root.y
>
T2.root.yL R
T2
(T2.root.y)
T
(T1.root.y)
T1L T1R T2
Слияние декартовых деревьев (Merge)
 Операция Merge(T1, T2) сливает два декартовых дерева T1 и T2
в новое дерево T (причем все ключи x дерева T2 должны быть
больше ключей x дерева T1)
 Случай 2 (симметричный): Приоритет y корня T1 < приоритета y
корня T2
 Корень дерева T2 становится корнем T
 Правое поддерево T2 становится правым поддеревом T
 Левое поддерево T – это объединение T1 и левого поддерева T2
L R
T1
(T1.root.y)
Merge(T1, T2, T)
T1.root.y
<
T2.root.yL R
T2
(T2.root.y)
T
(T2.root.y)
T2RT1 T2L
Слияние декартовых деревьев (Merge)
14
TLookup = O(log(logu))
function TreapMerge(treap1, treap2, &treap)
if treap1 = NULL OR treap2 = NULL then
treap = treap1
if treap1 = NULL then
treap = treap2
else if treap1.y > treap2.y then
TreapMerge(treap1.right, treap2, treap1.right)
treap = treap1
else
TreapMerge(treap2.left, treap1, treap2.left)
treap = treap2
end if
end function
 В худшем случае требуется спуск по дерево до листа –
выполняется порядка O(h) разбиений
TMerge = O(h) = O(n)
Добавление элемента в декартово дерево
15
 Операция Insert(T, x, y, value) добавляет в декартово дерево
узел node с ключом x, приоритетом y и значением value
 Узел node – это декартово дерево из одного элемента
 Можно слить дерево T и дерево node, но по требованию
операции Merge, все ключи дерева node должны быть
больше ключей T
 В дереве T некоторые ключи могут быть как больше x,
так и меньше x
L R
T node
x, y,
value∀𝑥 𝑇 ∈ 𝑇: 𝒙 𝑻 < 𝒏𝒐𝒅𝒆. 𝒙
?
Добавление элемента в декартово дерево
16
 Версия 1. Преобразуем деревья для удовлетворения
требований операции Merge
 Разобьём дерево T по ключу node.x на два поддерева T1 и T2,
таким образом в дереве T1 будут узлы с x ≤ node.x, а в дереве
T2 с ключами x > node.x
 Сливаем дерево T1 и дерево node в дерево T1
 Сливаем новое дерево T1 и дерево T2 в дерево T1
function TreapInsert(treap, node)
TreapSplit(treap, node.x, t1, t2) // O(h)
TreapMerge(t1, node, t1) // O(h)
TreapMerge(t1, t2, t1) // O(h)
return t1
end function
TInsert = O(h) = O(n)
Добавление элемента в декартово дерево
17
 Версия 2 – без использования операции слияния (Merge)
 Спускаемся по дереву поиска (по ключу node.x),
останавливаемся на узле z, в котором приоритет z.y меньше
приоритета node.y
 Разбиваем дерево z по ключу node.x: в поддереве T1 узлы z
с ключами ≤ node.x, в T2 – с ключами > node.x
 Делаем T1 и T2 левым и правым поддеревьями узла node
 Дерево node ставим на место узла z
T
y
Split(z, node.x)
z
T
T1 T2
xz
18
function TreapDelete(treap, x)
node = TreapLookup(treap, x) // O(h)
TreapSplit(treap, x, t1, t2) // O(h)
TreapSplit(t1, x - eps, t1, t3) // O(h)
TreapMerge(t1, t2, t1) // O(h)
return t1
end function
Удаление элемента из декартова дерева
 Версия 1 – с использованием операции Split
 Находим в дереве T узел node с ключом x
 Разбиваем дерево T по ключу x на деревья T1 и T2: Split(T, x)
 Отделяем от дерева T1 узел с ключом x, для этого разбиваем
T1 по ключу x – ε на поддеревья T1 и T3 (содержит ключ x):
Split(T1, x – ε)
 Сливаем деревья T1 и T2: Merge(T1, T2)
TDeletet = O(h) = O(n)
19
Удаление элемента из декартова дерева
 Версия 2 – без использования операции Split
 Находим в дереве T узел node с ключом x
 Сливаем левое и правое поддеревья дерева node:
Merge(node.left, node.right)
 Результат слияния поддеревьев ставим на место узла node
Высота декартова дерева
20
 В худшем случае высота декартова дерева O(n)
 Например, при вставке ключей: (1, 1), (2, 2), …, (n, n)
1, 1
Value1
2, 2
Value2
3, 3
Value3
4, 4
Value4
NULL
NULL
NULL
 Как избежать
такой ситуации?
 Мы можем
задавать приоритеты
для регулирования высоты дерева
Псевдослучайные приоритеты
21
Утверждение. В декартовом дереве из n узлов, приоритет y
которых является случайной величиной c равномерным
распределением, средняя глубина вершины равна O(logn)
Доказательство
 Разобрать самостоятельно:
http://neerc.ifmo.ru/wiki/index.php?title=%D0%94%D0%B5%D0%BA%D0%B0%D1
%80%D1%82%D0%BE%D0%B2%D0%BE_%D0%B4%D0%B5%D1%80%D0%B5%D0%
B2%D0%BE
□
 Таким образом в декартовом дереве с псевдослучайными
приоритетами время выполнение операций Split, Merge, Insert,
Delete равно O(logn)
Задания
22
 Разобрать доказательство утверждения о высоте декартова
дерева со случайными приоритетами
 Изучить способы построения декартова дерева при условии,
что все добавляемые элементы известны заранее (offline):
(x1, y1), …., (xn, yn)
 Алгоритм со сложностью O(n2)
 Алгоритм с линейной сложностью O(n)
1. http://ru.wikipedia.org/wiki/%D0%94%D0%B5%D0%BA%D0%B0%D1%80%D1%82%D0%BE%D0%B2%
D0%BE_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%BE
 Прочитать про неявные декартовы деревья
http://e-maxx.ru/algo/treap

More Related Content

What's hot

Лекция 8: Дерево Ван Эмде Боаса (Van Emde Boas tree)
Лекция 8: Дерево Ван Эмде Боаса (Van Emde Boas tree)Лекция 8: Дерево Ван Эмде Боаса (Van Emde Boas tree)
Лекция 8: Дерево Ван Эмде Боаса (Van Emde Boas tree)
Mikhail Kurnosov
 
Лекция 2: АВЛ-деревья (AVL trees)
Лекция 2: АВЛ-деревья (AVL trees)Лекция 2: АВЛ-деревья (AVL trees)
Лекция 2: АВЛ-деревья (AVL trees)
Mikhail Kurnosov
 
Лекция 6: Биномиальные кучи (Binomial heaps)
Лекция 6: Биномиальные кучи (Binomial heaps)Лекция 6: Биномиальные кучи (Binomial heaps)
Лекция 6: Биномиальные кучи (Binomial heaps)
Mikhail Kurnosov
 
Лекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные спискиЛекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные списки
Mikhail Kurnosov
 
Лекция 5: B-деревья (B-trees, k-way merge sort)
Лекция 5: B-деревья (B-trees, k-way merge sort)Лекция 5: B-деревья (B-trees, k-way merge sort)
Лекция 5: B-деревья (B-trees, k-way merge sort)
Mikhail Kurnosov
 
Лекция 5: Бинарные деревья поиска
Лекция 5: Бинарные деревья поискаЛекция 5: Бинарные деревья поиска
Лекция 5: Бинарные деревья поиска
Mikhail Kurnosov
 
Алгоритмы и структуры данных осень 2013 лекция 2
Алгоритмы и структуры данных осень 2013 лекция 2Алгоритмы и структуры данных осень 2013 лекция 2
Алгоритмы и структуры данных осень 2013 лекция 2
Technopark
 
Алгоритмы и структуры данных осень 2013 лекция 1
Алгоритмы и структуры данных осень 2013 лекция 1Алгоритмы и структуры данных осень 2013 лекция 1
Алгоритмы и структуры данных осень 2013 лекция 1
Technopark
 

What's hot (20)

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

Viewers also liked

Использование Time-Stamp Counter для измерения времени выполнения кода на пр...
Использование Time-Stamp Counter для измерения времени выполнения кода  на пр...Использование Time-Stamp Counter для измерения времени выполнения кода  на пр...
Использование Time-Stamp Counter для измерения времени выполнения кода на пр...
Mikhail Kurnosov
 

Viewers also liked (20)

Векторизация кода (семинар 2)
Векторизация кода (семинар 2)Векторизация кода (семинар 2)
Векторизация кода (семинар 2)
 
Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMP
 
Векторизация кода (семинар 3)
Векторизация кода (семинар 3)Векторизация кода (семинар 3)
Векторизация кода (семинар 3)
 
Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)
 
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
 
Векторизация кода (семинар 1)
Векторизация кода (семинар 1)Векторизация кода (семинар 1)
Векторизация кода (семинар 1)
 
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
 
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
 
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
 
Лекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимостиЛекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимости
 
Лекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмовЛекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмов
 
Лекция 1. Амортизационный анализ (amortized analysis)
Лекция 1. Амортизационный анализ (amortized analysis)Лекция 1. Амортизационный анализ (amortized analysis)
Лекция 1. Амортизационный анализ (amortized analysis)
 
Лекция 7. Язык параллельного программирования Intel Cilk Plus
Лекция 7. Язык параллельного программирования Intel Cilk PlusЛекция 7. Язык параллельного программирования Intel Cilk Plus
Лекция 7. Язык параллельного программирования Intel Cilk Plus
 
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, paral...
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, paral...Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, paral...
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, paral...
 
Семинар 1. Многопоточное программирование на OpenMP (часть 1)
Семинар 1. Многопоточное программирование на OpenMP (часть 1)Семинар 1. Многопоточное программирование на OpenMP (часть 1)
Семинар 1. Многопоточное программирование на OpenMP (часть 1)
 
Использование Time-Stamp Counter для измерения времени выполнения кода на пр...
Использование Time-Stamp Counter для измерения времени выполнения кода  на пр...Использование Time-Stamp Counter для измерения времени выполнения кода  на пр...
Использование Time-Stamp Counter для измерения времени выполнения кода на пр...
 
Лекция 9. Программирование GPU
Лекция 9. Программирование GPUЛекция 9. Программирование GPU
Лекция 9. Программирование GPU
 
Лекция 8. Intel Threading Building Blocks
Лекция 8. Intel Threading Building BlocksЛекция 8. Intel Threading Building Blocks
Лекция 8. Intel Threading Building Blocks
 
Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)
 

Similar to Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)

Алгоритмы и структуры данных осень 2013 лекция 6
Алгоритмы и структуры данных осень 2013 лекция 6Алгоритмы и структуры данных осень 2013 лекция 6
Алгоритмы и структуры данных осень 2013 лекция 6
Technopark
 
Лекция №6. Деревья. Предмет "Структуры и алгоритмы обработки данных"
Лекция №6. Деревья. Предмет "Структуры и алгоритмы обработки данных"Лекция №6. Деревья. Предмет "Структуры и алгоритмы обработки данных"
Лекция №6. Деревья. Предмет "Структуры и алгоритмы обработки данных"
Nikolay Grebenshikov
 
Алгоритмы и структуры данных осень 2013 лекция 5
Алгоритмы и структуры данных осень 2013 лекция 5Алгоритмы и структуры данных осень 2013 лекция 5
Алгоритмы и структуры данных осень 2013 лекция 5
Technopark
 
Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки да...
Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки да...Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки да...
Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки да...
Nikolay Grebenshikov
 
Лекция №3. Анализ алгоритмов. Предмет "Структуры и алгоритмы обработки данных"
Лекция №3. Анализ алгоритмов. Предмет "Структуры и алгоритмы обработки данных"Лекция №3. Анализ алгоритмов. Предмет "Структуры и алгоритмы обработки данных"
Лекция №3. Анализ алгоритмов. Предмет "Структуры и алгоритмы обработки данных"
Nikolay Grebenshikov
 
Лекция №11. Работа с внешней памятью (файлами). Предмет "Структуры и алгоритм...
Лекция №11. Работа с внешней памятью (файлами). Предмет "Структуры и алгоритм...Лекция №11. Работа с внешней памятью (файлами). Предмет "Структуры и алгоритм...
Лекция №11. Работа с внешней памятью (файлами). Предмет "Структуры и алгоритм...
Nikolay Grebenshikov
 
Определенные интеграллы
Определенные интеграллыОпределенные интеграллы
Определенные интеграллы
daryaartuh
 
презентация с авторским шаблоном и заметками дз 28.03.12
презентация с авторским шаблоном и заметками дз 28.03.12презентация с авторским шаблоном и заметками дз 28.03.12
презентация с авторским шаблоном и заметками дз 28.03.12
galinalevna
 
Мысль №6
Мысль №6Мысль №6
Мысль №6
rasparin
 
Мысль №6
Мысль №6Мысль №6
Мысль №6
rasparin
 
20101125 proof complexity_hirsch_lecture08
20101125 proof complexity_hirsch_lecture0820101125 proof complexity_hirsch_lecture08
20101125 proof complexity_hirsch_lecture08
Computer Science Club
 
DUMP-2013 Наука и жизнь - Приближённый подсчёт количества уникальных элементо...
DUMP-2013 Наука и жизнь - Приближённый подсчёт количества уникальных элементо...DUMP-2013 Наука и жизнь - Приближённый подсчёт количества уникальных элементо...
DUMP-2013 Наука и жизнь - Приближённый подсчёт количества уникальных элементо...
it-people
 
презентация с авторским шаблоном и заметками Levinaga
презентация с авторским шаблоном и заметками Levinagaпрезентация с авторским шаблоном и заметками Levinaga
презентация с авторским шаблоном и заметками Levinaga
Galnalevina
 
презентация с авторским шаблоном и заметками Levinaga
презентация с авторским шаблоном и заметками Levinagaпрезентация с авторским шаблоном и заметками Levinaga
презентация с авторским шаблоном и заметками Levinaga
levinaga
 
презентация с авторским шаблоном и заметками Levinaga
презентация с авторским шаблоном и заметками Levinagaпрезентация с авторским шаблоном и заметками Levinaga
презентация с авторским шаблоном и заметками Levinaga
Galnalevina
 
презентация с авторским шаблоном и заметками Levinaga
презентация с авторским шаблоном и заметками Levinagaпрезентация с авторским шаблоном и заметками Levinaga
презентация с авторским шаблоном и заметками Levinaga
Galnalevina
 

Similar to Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды) (20)

Алгоритмы и структуры данных осень 2013 лекция 6
Алгоритмы и структуры данных осень 2013 лекция 6Алгоритмы и структуры данных осень 2013 лекция 6
Алгоритмы и структуры данных осень 2013 лекция 6
 
Лекция №6. Деревья. Предмет "Структуры и алгоритмы обработки данных"
Лекция №6. Деревья. Предмет "Структуры и алгоритмы обработки данных"Лекция №6. Деревья. Предмет "Структуры и алгоритмы обработки данных"
Лекция №6. Деревья. Предмет "Структуры и алгоритмы обработки данных"
 
Левосторонняя куча
Левосторонняя кучаЛевосторонняя куча
Левосторонняя куча
 
Алгоритмы и структуры данных осень 2013 лекция 5
Алгоритмы и структуры данных осень 2013 лекция 5Алгоритмы и структуры данных осень 2013 лекция 5
Алгоритмы и структуры данных осень 2013 лекция 5
 
Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки да...
Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки да...Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки да...
Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки да...
 
Лекция №3. Анализ алгоритмов. Предмет "Структуры и алгоритмы обработки данных"
Лекция №3. Анализ алгоритмов. Предмет "Структуры и алгоритмы обработки данных"Лекция №3. Анализ алгоритмов. Предмет "Структуры и алгоритмы обработки данных"
Лекция №3. Анализ алгоритмов. Предмет "Структуры и алгоритмы обработки данных"
 
Лекция №11. Работа с внешней памятью (файлами). Предмет "Структуры и алгоритм...
Лекция №11. Работа с внешней памятью (файлами). Предмет "Структуры и алгоритм...Лекция №11. Работа с внешней памятью (файлами). Предмет "Структуры и алгоритм...
Лекция №11. Работа с внешней памятью (файлами). Предмет "Структуры и алгоритм...
 
Определенные интегралы
Определенные интегралыОпределенные интегралы
Определенные интегралы
 
Определенные интеграллы
Определенные интеграллыОпределенные интеграллы
Определенные интеграллы
 
презентация с авторским шаблоном и заметками дз 28.03.12
презентация с авторским шаблоном и заметками дз 28.03.12презентация с авторским шаблоном и заметками дз 28.03.12
презентация с авторским шаблоном и заметками дз 28.03.12
 
Мысль №6
Мысль №6Мысль №6
Мысль №6
 
Мысль №6
Мысль №6Мысль №6
Мысль №6
 
20101125 proof complexity_hirsch_lecture08
20101125 proof complexity_hirsch_lecture0820101125 proof complexity_hirsch_lecture08
20101125 proof complexity_hirsch_lecture08
 
DUMP-2013 Наука и жизнь - Приближённый подсчёт количества уникальных элементо...
DUMP-2013 Наука и жизнь - Приближённый подсчёт количества уникальных элементо...DUMP-2013 Наука и жизнь - Приближённый подсчёт количества уникальных элементо...
DUMP-2013 Наука и жизнь - Приближённый подсчёт количества уникальных элементо...
 
многочлены чебышева
многочлены чебышевамногочлены чебышева
многочлены чебышева
 
Лекция 6 Элементарные структуры данных часть 4
Лекция 6 Элементарные структуры данных часть 4Лекция 6 Элементарные структуры данных часть 4
Лекция 6 Элементарные структуры данных часть 4
 
презентация с авторским шаблоном и заметками Levinaga
презентация с авторским шаблоном и заметками Levinagaпрезентация с авторским шаблоном и заметками Levinaga
презентация с авторским шаблоном и заметками Levinaga
 
презентация с авторским шаблоном и заметками Levinaga
презентация с авторским шаблоном и заметками Levinagaпрезентация с авторским шаблоном и заметками Levinaga
презентация с авторским шаблоном и заметками Levinaga
 
презентация с авторским шаблоном и заметками Levinaga
презентация с авторским шаблоном и заметками Levinagaпрезентация с авторским шаблоном и заметками Levinaga
презентация с авторским шаблоном и заметками Levinaga
 
презентация с авторским шаблоном и заметками Levinaga
презентация с авторским шаблоном и заметками Levinagaпрезентация с авторским шаблоном и заметками Levinaga
презентация с авторским шаблоном и заметками Levinaga
 

More from Mikhail Kurnosov

More from Mikhail Kurnosov (9)

Семинар 10. Параллельное программирование на MPI (часть 3)
Семинар 10. Параллельное программирование на MPI (часть 3)Семинар 10. Параллельное программирование на MPI (часть 3)
Семинар 10. Параллельное программирование на MPI (часть 3)
 
Семинар 9. Параллельное программирование на MPI (часть 2)
Семинар 9. Параллельное программирование на MPI (часть 2)Семинар 9. Параллельное программирование на MPI (часть 2)
Семинар 9. Параллельное программирование на MPI (часть 2)
 
Лекция 9. Поиск кратчайшего пути в графе
Лекция 9. Поиск кратчайшего пути в графеЛекция 9. Поиск кратчайшего пути в графе
Лекция 9. Поиск кратчайшего пути в графе
 
Семинар 8. Параллельное программирование на MPI (часть 1)
Семинар 8. Параллельное программирование на MPI (часть 1)Семинар 8. Параллельное программирование на MPI (часть 1)
Семинар 8. Параллельное программирование на MPI (часть 1)
 
Лекция 8. Графы. Обходы графов
Лекция 8. Графы. Обходы графовЛекция 8. Графы. Обходы графов
Лекция 8. Графы. Обходы графов
 
Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Семинар 7. Многопоточное программирование на OpenMP (часть 7)Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Семинар 7. Многопоточное программирование на OpenMP (часть 7)
 
Семинар 6. Многопоточное программирование на OpenMP (часть 6)
Семинар 6. Многопоточное программирование на OpenMP (часть 6)Семинар 6. Многопоточное программирование на OpenMP (часть 6)
Семинар 6. Многопоточное программирование на OpenMP (часть 6)
 
Лекция 6. Хеш-таблицы
Лекция 6. Хеш-таблицыЛекция 6. Хеш-таблицы
Лекция 6. Хеш-таблицы
 
Семинар 5. Многопоточное программирование на OpenMP (часть 5)
Семинар 5. Многопоточное программирование на OpenMP (часть 5)Семинар 5. Многопоточное программирование на OpenMP (часть 5)
Семинар 5. Многопоточное программирование на OpenMP (часть 5)
 

Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)

  • 1. Лекция 7 Декартовы деревья (treaps) Курносов Михаил Георгиевич E-mail: mkurnosov@gmail.com WWW: www.mkurnosov.net Курс «Структуры и алгоритмы обработки данных» Сибирский государственный университет телекоммуникаций и информатики (Новосибирск) Осенний семестр, 2015
  • 2. Двоичные деревья поиска (Binary Search Trees) 2 1 Value1 2 Value2 1. Операции над BST имеют трудоемкость пропорциональную высоте дерева O(h) 2. В среднем случае высота h бинарного дерева поиска O(logn) 3. В худшем случае элементы добавляются по возрастанию (убыванию) ключей – дерево вырождается в список длины n bstree_add(1, value1) bstree_add(2, value2) bstree_add(3, value3) bstree_add(4, value4) 3 Value3 4 Value4 NULL NULL NULL В худшем случае бинарное дерево поиска имеет высоту O(n)
  • 3. Декартово дерево (Treap) 3  Декартово дерево (Treap) – это структура данных для реализации словаря, объединяющая в себе бинарное дерево поиска и бинарную кучу  Происхождение названия: treap = tree + heap  Русскоязычный аналог названия: дуча = дерево + куча, дерамида = дерево + пирамида  Авторы: Сидель Раймунд (Seidel Raimund), Цецилия Арагон (Aragon Cecilia), 1989  Aragon Cecilia R., Seidel Raimund. Randomized Search Trees // Proc. of 30th Symp. Foundations of Computer Science (IEEE Computer Society Press), 1989, pp. 540-545  Seidel Raimund, Aragon Cecilia R. Randomized Search Trees // Algorithmica. – 1996. – 16 (4/5). – pp. 464–497
  • 4. Декартово дерево (Treap) 4  Каждый узел декартова дерева (treap) содержит:  пару (x, y) x – ключ бинарного дерева поиска, y – приоритет бинарной кучи  указатель left на левое поддерево  указатель right на правое поддерево  Предполагается, что все x и y различны (x0, y0) (xL, yL) (xR, yR) (1) Свойства дерева поиска: xL < x0 < xR (2) Свойства бинарной кучи: y0 < yL y0 < yR
  • 5. Пример декартова дерева 5 C 5 B 10 D 14 K 3 Z 4 Пример декартова дерева: ключи дерева поиска – буквы алфавита, приоритет кучи (min-heap) – числа
  • 6. Операции декартова дерева 6 Операция Средний случай (average case) Худший случай (worst case) Lookup(x) 𝑂(log 𝑛) Amortized 𝑂(log 𝑛) Insert(x,value) 𝑂(log 𝑛) Amortized 𝑂(log 𝑛) Delete(x) 𝑂(log 𝑛) Amortized 𝑂(log 𝑛) Split(x) 𝑂(log 𝑛) 𝑂(𝑛) Merge(T1, T2) 𝑂(log 𝑛) 𝑂(𝑛)  Сложность по памяти 𝑂(𝑛)
  • 7. Поиск элемента в декартовом дереве 7 TLookup = O(log(logu)) function TreapLookup(treap, x) while treap != NULL do if x = treap.x then return treap; else if x < treap.x then treap = treap.left else treap = treap.right end if end while return NULL; end function  При поиске элемента приоритет y игнорируется, учитываются только ключи x – как в обычном бинарном дереве поиска  В худшем случае спуск по дереву осуществляется до листа – выполняется порядка O(h) сравнений TLookup = O(h) = O(n)
  • 8. Разбиение декартова дерева (Split) 8  Операция Split(T, x) разбивает декартово дерево на два дерева T1 и T2  В дереве T1 находятся узлы с ключами node.x ≤ x  В дереве T2 находятся узлы с ключами node.x > x C 5 B 10 D 14 K 3 Z 4 Split(T, E) T1 T2
  • 9. Разбиение декартова дерева (Split) 9  Случай 1: ключ разбиения x > root.x (ключ в корне)  Левое поддерево T1 совпадает с левым поддеревом корня T  Для нахождения правого поддерева T1 необходимо разбить правое поддерево T по ключу x на T1R и T2R и взять T1R  Дерево T2 совпадает с деревом T2R L R T (root.x) L T1 T2Split(T, x) x > root.x T1R T2R
  • 10. Разбиение декартова дерева (Split) 10  Случай 2 (симметричный): ключ разбиения x < root.x  Правое поддерево T2 совпадает с правым поддеревом корня T  Для нахождения левого поддерева T2 необходимо разбить левое поддерево T по ключу x на T1L и T2L и взять T2L  Дерево T1 совпадает с деревом T1L L R T (root.x) T1 Split(T, x) x < root.x R T2 T2L T1L
  • 11. Разбиение декартова дерева (Split) 11 TLookup = O(log(logu)) function TreapSplit(treap, x, &treap1, &treap2) if treap = NULL then treap1 = treap2 = NULL else if x > treap.x then TreapSplit(treap.right, x, treap.right, treap2) treap1 = treap else TreapSplit(treap.left, x, treap1, treap.left) treap2 = treap end if end function  В худшем случае требуется спуск по дереву до листа – выполняется порядка O(h) разбиений TSplit = O(h) = O(n)
  • 12. Слияние декартовых деревьев (Merge)  Операция Merge(T1, T2) сливает два декартовых дерева T1 и T2 в новое дерево T (причем все ключи x дерева T2 должны быть больше ключей x дерева T1)  Случай 1: Приоритет y корня T1 > приоритета y корня T2  Корень дерева T1 становится корнем T  Левое поддерево T1 становится левым поддеревом T  Правое поддерево T – это объединение правого поддерева T1 и дерева T2 L R T1 (T1.root.y) Merge(T1, T2, T) T1.root.y > T2.root.yL R T2 (T2.root.y) T (T1.root.y) T1L T1R T2
  • 13. Слияние декартовых деревьев (Merge)  Операция Merge(T1, T2) сливает два декартовых дерева T1 и T2 в новое дерево T (причем все ключи x дерева T2 должны быть больше ключей x дерева T1)  Случай 2 (симметричный): Приоритет y корня T1 < приоритета y корня T2  Корень дерева T2 становится корнем T  Правое поддерево T2 становится правым поддеревом T  Левое поддерево T – это объединение T1 и левого поддерева T2 L R T1 (T1.root.y) Merge(T1, T2, T) T1.root.y < T2.root.yL R T2 (T2.root.y) T (T2.root.y) T2RT1 T2L
  • 14. Слияние декартовых деревьев (Merge) 14 TLookup = O(log(logu)) function TreapMerge(treap1, treap2, &treap) if treap1 = NULL OR treap2 = NULL then treap = treap1 if treap1 = NULL then treap = treap2 else if treap1.y > treap2.y then TreapMerge(treap1.right, treap2, treap1.right) treap = treap1 else TreapMerge(treap2.left, treap1, treap2.left) treap = treap2 end if end function  В худшем случае требуется спуск по дерево до листа – выполняется порядка O(h) разбиений TMerge = O(h) = O(n)
  • 15. Добавление элемента в декартово дерево 15  Операция Insert(T, x, y, value) добавляет в декартово дерево узел node с ключом x, приоритетом y и значением value  Узел node – это декартово дерево из одного элемента  Можно слить дерево T и дерево node, но по требованию операции Merge, все ключи дерева node должны быть больше ключей T  В дереве T некоторые ключи могут быть как больше x, так и меньше x L R T node x, y, value∀𝑥 𝑇 ∈ 𝑇: 𝒙 𝑻 < 𝒏𝒐𝒅𝒆. 𝒙 ?
  • 16. Добавление элемента в декартово дерево 16  Версия 1. Преобразуем деревья для удовлетворения требований операции Merge  Разобьём дерево T по ключу node.x на два поддерева T1 и T2, таким образом в дереве T1 будут узлы с x ≤ node.x, а в дереве T2 с ключами x > node.x  Сливаем дерево T1 и дерево node в дерево T1  Сливаем новое дерево T1 и дерево T2 в дерево T1 function TreapInsert(treap, node) TreapSplit(treap, node.x, t1, t2) // O(h) TreapMerge(t1, node, t1) // O(h) TreapMerge(t1, t2, t1) // O(h) return t1 end function TInsert = O(h) = O(n)
  • 17. Добавление элемента в декартово дерево 17  Версия 2 – без использования операции слияния (Merge)  Спускаемся по дереву поиска (по ключу node.x), останавливаемся на узле z, в котором приоритет z.y меньше приоритета node.y  Разбиваем дерево z по ключу node.x: в поддереве T1 узлы z с ключами ≤ node.x, в T2 – с ключами > node.x  Делаем T1 и T2 левым и правым поддеревьями узла node  Дерево node ставим на место узла z T y Split(z, node.x) z T T1 T2 xz
  • 18. 18 function TreapDelete(treap, x) node = TreapLookup(treap, x) // O(h) TreapSplit(treap, x, t1, t2) // O(h) TreapSplit(t1, x - eps, t1, t3) // O(h) TreapMerge(t1, t2, t1) // O(h) return t1 end function Удаление элемента из декартова дерева  Версия 1 – с использованием операции Split  Находим в дереве T узел node с ключом x  Разбиваем дерево T по ключу x на деревья T1 и T2: Split(T, x)  Отделяем от дерева T1 узел с ключом x, для этого разбиваем T1 по ключу x – ε на поддеревья T1 и T3 (содержит ключ x): Split(T1, x – ε)  Сливаем деревья T1 и T2: Merge(T1, T2) TDeletet = O(h) = O(n)
  • 19. 19 Удаление элемента из декартова дерева  Версия 2 – без использования операции Split  Находим в дереве T узел node с ключом x  Сливаем левое и правое поддеревья дерева node: Merge(node.left, node.right)  Результат слияния поддеревьев ставим на место узла node
  • 20. Высота декартова дерева 20  В худшем случае высота декартова дерева O(n)  Например, при вставке ключей: (1, 1), (2, 2), …, (n, n) 1, 1 Value1 2, 2 Value2 3, 3 Value3 4, 4 Value4 NULL NULL NULL  Как избежать такой ситуации?  Мы можем задавать приоритеты для регулирования высоты дерева
  • 21. Псевдослучайные приоритеты 21 Утверждение. В декартовом дереве из n узлов, приоритет y которых является случайной величиной c равномерным распределением, средняя глубина вершины равна O(logn) Доказательство  Разобрать самостоятельно: http://neerc.ifmo.ru/wiki/index.php?title=%D0%94%D0%B5%D0%BA%D0%B0%D1 %80%D1%82%D0%BE%D0%B2%D0%BE_%D0%B4%D0%B5%D1%80%D0%B5%D0% B2%D0%BE □  Таким образом в декартовом дереве с псевдослучайными приоритетами время выполнение операций Split, Merge, Insert, Delete равно O(logn)
  • 22. Задания 22  Разобрать доказательство утверждения о высоте декартова дерева со случайными приоритетами  Изучить способы построения декартова дерева при условии, что все добавляемые элементы известны заранее (offline): (x1, y1), …., (xn, yn)  Алгоритм со сложностью O(n2)  Алгоритм с линейной сложностью O(n) 1. http://ru.wikipedia.org/wiki/%D0%94%D0%B5%D0%BA%D0%B0%D1%80%D1%82%D0%BE%D0%B2% D0%BE_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%BE  Прочитать про неявные декартовы деревья http://e-maxx.ru/algo/treap