SlideShare a Scribd company logo
1 of 32
Download to read offline
Лекция 5
Бинарные деревья поиска
Курносов Михаил Георгиевич
к.т.н. доцент Кафедры вычислительных систем
Сибирский государственный университет
телекоммуникаций и информатики

http://www.mkurnosov.net/teaching
Структура данных “Словарь” (Dictionary)
 Словарь (ассоциативный массив, associative array, map,
dictionary) – структура (контейнер) данных для хранения
пар вида “ключ – значение” (key – value)
Ключ (Key)

Значение (Value)

890

Слон

1200

Кит

260

Лев

530

Жираф

2
Словарь
Операция

Add(map, key, value)

Описание
Помещает в словарь map
пару (key, value)

Lookup(map, key)

Возвращает из словаря map значение
ассоциированное с ключом key

Remove(map, key)

Удаляет из словаря map значение
ассоциированное с ключом key

Min(map)

Возвращает из словаря map
минимальное значение

Max(map)

Возвращает из словаря map
максимальное значение
3
Реализация АТД “Словарь”
 Реализации словарей отличаются вычислительной
сложностью операций добавления, поиска и удаления
элементов
 Наибольшее распространение получили следующие
реализации:
1. Деревья поиска (Search trees)
2. Хэш-таблицы (Hash tables)

3. Связные списки
4. Массивы

4
Реализация словаря на основе массива
Операция

Неотсортированный
массив

Отсортированный
массив

Add
(map, key, value)

O(1)
(добавление в конец)

O(n)
(поиск позиции)

Lookup
(map, key)

O(n)

O(logn)
(бинарный поиск)

Remove
(map, key)

O(n)
(поиск элемента и
перенос последнего
на место удаляемого)

O(n)
(перенос элементов)

Min(map)

O(n)

O(1)
(элемент v[1])

Max(map)

O(n)

O(1)
(элемент v[n])
5
Реализация словаря на основе связного списка
Операция

Неотсортированный
связный список

Отсортированный
связный список

Add
(map, key, value)

O(1)
(добавление
в начало)

O(n)
(поиск позиции)

Lookup
(map, key)

O(n)

O(n)

Remove
(map, key)

O(n)
(поиск элемента)

O(n)
(перенос элементов)

Min(map)

O(n)

O(1)

O(n)

O(n) или O(1), если
поддерживать указатель
на последний элемент

Max(map)

6
Бинарные деревья (Binary trees)
 Двоичное дерево (Binary tree) – это дерево
(структура данных), в которой каждый узел (node) имеет
не более двух дочерних узлов (child nodes)
Root node
Depth 0

Parent node
Child node

Depth 1

Depth 2

Leaf node
Depth 3
7
Бинарные деревья поиска (Binary search trees)


Двоичное дерево поиска (Binary search tree, BST) –
это двоичное дерево, в котором:
1) каждый узел x (node) имеет не более двух дочерних
узлов (child nodes) и содержит ключ (key) и значение
(value)
2) ключи всех узлов левого поддерева
узла x меньше значения его ключа

3) ключи всех узлов правого поддерева
узла x больше значения его ключа

Key: 530

Value: Жираф
Left

Right

8
Двоичные деревья поиска (Binary search trees)
Словарь

Двоичное дерево поиска
Key: 530

Ключ
(Key)

Значение
(Value)

530

Жираф

260

Лев

Key: 260

Key: 890

890

Слон

Value: Лев

Value: Слон

1200

Кит

Left

Left

Value: Жираф
Left

Right

Right

Right

Key: 1200
Value: Кит
Left

Right

9
Двоичные деревья поиска (Binary search trees)
180
Тигр

15

200

Барсук

Лев

8

60

4000

Лиса

Волк

Слон

35

90

600

Рысь

Ягуар

Медведь

Бинарное дерево поиска: 9 элементов, глубина (depth) = 3
Ordered map – упорядоченный ассоциативный массив

10
Двоичные деревья поиска (Binary search trees)
#include <stdio.h>
#include <stdlib.h>
struct bstree {
int key;
char *value;

/* Ключ */
/* Данные */

struct bstree *left;
struct bstree *right;
};

11
Создание элемента BST
struct bstree *bstree_create(int key,
char *value)
{
struct bstree *node;
node = malloc(sizeof(*node));
if (node != NULL) {
node->key = key;
node->value = value;
node->left = NULL;
node->right = NULL;
}
return node;
}

TCreate = O(1)
12
Создание элемента BST
int main()
{
struct bstree *tree;
tree = bstree_create(180, "Tigr");
return 0;
}

13
Добавление элемента в BST
180

1. Добавление элемента (180, Тигр)

Тигр

2. Добавление элемента (200, Лев)
3. Добавление элемента (15, Барсук)

15

200

Барсук

Лев

4. Добавление элемента (60, Волк)
60
Волк

Ищем листовой узел (leaf node) для вставки
нового элемента
14
Добавление элемента в BST
void bstree_add(struct bstree *tree,
int key, char *value)
{
struct bstree *parent, *node;
if (tree == NULL)
return;
/* Отыскиваем листовой узел */
for (parent = tree; tree != NULL; ) {
parent = tree;
if (key < tree->key)
tree = tree->left;
else if (key > tree->key)
tree = tree->right;
else
return;
}

15
Добавление элемента в BST (продолжение)
/* Создаем элемент и связываем с узлом */
node = bstree_create(key, value);
if (key < parent->key)
parent->left = node;
else
parent->right = node;

}

TAdd = O(h)

 При добавлении элемента необходимо спуститься от корня
дерева до листа – это требует количества операций порядка
высоты h дерева

 Поиск листа – O(h), создание элемента и корректировка
указателей – O(1)
16
Поиск элемента в BST
1. Сравниваем ключ корневого
узла с искомым. Если совпали,
то элемент найден
2. Переходим к левому или
правому дочернему узлу и
повторяем шаг 1

180
Тигр

15

200

Барсук

Лев

60
Волк

Возможны рекурсивная и не рекурсивная реализации
17
Поиск элемента в BST
struct bstree *bstree_lookup(struct bstree *tree,
int key)
{
while (tree != NULL) {
if (key == tree->key) {
return tree;
} else if (key < tree->key) {
tree = tree->left;
} else {
tree = tree->right;
}
}
return tree;
TLookup = O(h)
}
18
Поиск минимального элемента в BST




Минимальный элемент всегда
расположен в левом поддереве
корневого узла
Требуется найти самого левого
потомка корневого узла

180
Тигр

15

200

Барсук

Лев

60
Волк

19
Поиск минимального элемента в BST
struct bstree *bstree_min(struct bstree *tree)
{
if (tree == NULL)
return NULL;

while (tree->left != NULL)
tree = tree->left;
return tree;
}

TMin = O(h)

20
Поиск максимального элемента в BST




Максимальный элемент всегда
расположен в правом поддереве
корневого узла
Требуется найти самого правого
потомка корневого узла

180
Тигр

15

200

Барсук

Лев

60
Волк

21
Поиск максимального элемента в BST
struct bstree *bstree_max(struct bstree *tree)
{
if (tree == NULL)
return NULL;
while (tree->right != NULL)
tree = tree->right;
return tree;
}

TMax = O(h)

22
Пример
int main()
{
struct bstree *tree, *node;

tree = bstree_create(180, "Tigr");
bstree_add(tree, 200, "Lev");
bstree_add(tree, 60, "Volk");
node = bstree_lookup(tree, 200);
printf(“Value = %sn", node->value);
node = bstree_min(tree);
printf("Min: value = %sn", node->value);
return 0;
}

23
Удаление элемента из BST
180

1. Находим узел z с заданным
ключом – O(n)

Тигр

2. Возможны 3 ситуации:
o узел z не имеет дочерних узлов

15

200

Барсук

Лев

o узел z имеет 1 дочерний узел
o узел z имеет 2 дочерних узла

10

60

Заяц

Волк

90
Кабан

24
Удаление элемента из BST
180

Удаление узла “Лев” (случай 1)

Тигр

1. Находим и удаляем узел “Лев”
из памяти (free)
15

2. Родительский указатель
(left или right) устанавливаем
в зачение NULL
“Тигр”->right = NULL

200

Барсук

Лев

10

60

Заяц

Волк

90
Кабан

25
Удаление элемента из BST
180

Удаление узла “Волк” (случай 2)

Тигр

1. Находим узел “Волк”
2. Родительский указатель
узла “Волк” (left или right)
устанавливаем на его дочерний
элемент
3. Удаляем узле “Волк” из памяти
“Барсук”->right = “Волк”->right

15

200

Барсук

Лев

10

60

Заяц

Волк

90
Кабан

26
Удаление элемента из BST
180

Удаление узла “Барсук” (случай 3)

Тигр

1. Находим узел “Барсук”
2. Находим узел с минимальным
ключом в правом поддереве
узла “Барсук” – самый
левый лист в поддереве
(узел “Рысь”)

15

200

Барсук

Лев

10

60

Заяц

Волк

90

45

Кабан

Рысь

3. Заменяем узел “Барсук”
узлом “Рысь”

55

70

150

Кабарга

Тапир

Марал

27
Удаление элемента из BST
Удаление узла “Барсук” (случай 3)

180
Тигр

180
Тигр

45
15
Барсук

Рысь

200

200
Лев

Лев

10
Заяц

10

60

Заяц

60
Волк

Волк

90
Кабан

90

45

Кабан

Рысь

55
55

70

150

Кабарга

Тапир

Марал

70

150

Кабарга

Тапир

Марал

28
Анализ эффективность BST
1. Операции имеют трудоемкость
пропорциональную высоте h дерева

1
Value

2. В худшем случае высота дерева O(n)
(вставка элементов в отсортированной
последовательности)

NULL

2
Value

3. В среднем случае высота дерева O(logn)

NULL

3
Value

NULL

bstree_add(tree,
bstree_add(tree,
bstree_add(tree,
bstree_add(tree,

“Item”,
“Item”,
“Item”,
“Item”,

1);
2);
3);
4);

4
Value

Дерево вырождается
в связный список

29
Реализация словаря на основе BST
Операция

Средний случай
(average case)

Худший случай
(worst case)

Add
(map, key, value)

O(logn)

O(n)

Lookup
(map, key)

O(logn)

O(n)

Remove
(map, key)

O(logn)

O(n)

Min(map)

O(logn)

O(n)

Max(map)

O(logn)

O(n)

30
Сбалансированные деревья поиска
 Сбалансированное по высоте дерево поиска
(self-balancing binary search tree) – дерево поиска,
в котором высоты поддеревьев узла различаются не более
чем на заданную константу k
 Баланс высоты поддерживается при выполнении операций
добавления и удаления элементов

 Типы сбалансированных деревьев поиска:






Красно-черные деревья (Red-black tree): ℎ ≤ 2 log 2 (𝑛 + 1)
АВЛ-деревья (AVL-tree): ℎ ≤ 1.44 ∙ log 2 𝑛;
B-деревья
Деревья Ван Эмде Боаса
…
Все операции на красно-черном дереве в худшем случае
выполняются за время O(logn)

31
Домашнее чтение
 Прочитать в “практике программирования”
[KR, С. 67] “2.8 Деревья”
 Прочитать в [CLRS, С. 325] раздел об удалении узла
из бинарного дерева поиска

32

More Related Content

What's hot

Лекция 6: Биномиальные кучи (Binomial heaps)
Лекция 6: Биномиальные кучи (Binomial heaps)Лекция 6: Биномиальные кучи (Binomial heaps)
Лекция 6: Биномиальные кучи (Binomial heaps)
Mikhail Kurnosov
 
Лекция 4: Префиксные деревья (Tries, prefix trees)
Лекция 4: Префиксные деревья (Tries, prefix trees)Лекция 4: Префиксные деревья (Tries, prefix trees)
Лекция 4: Префиксные деревья (Tries, prefix trees)
Mikhail Kurnosov
 
Лекция 8: Дерево Ван Эмде Боаса (Van Emde Boas tree)
Лекция 8: Дерево Ван Эмде Боаса (Van Emde Boas tree)Лекция 8: Дерево Ван Эмде Боаса (Van Emde Boas tree)
Лекция 8: Дерево Ван Эмде Боаса (Van Emde Boas tree)
Mikhail Kurnosov
 
Лекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные спискиЛекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные списки
Mikhail Kurnosov
 
Лекция 9: Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 9: Декартовы деревья (Treaps, дучи, дерамиды)Лекция 9: Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 9: Декартовы деревья (Treaps, дучи, дерамиды)
Mikhail Kurnosov
 
Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки да...
Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки да...Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки да...
Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки да...
Nikolay Grebenshikov
 
Алгоритмы и структуры данных весна 2014 лекция 2
Алгоритмы и структуры данных весна 2014 лекция 2Алгоритмы и структуры данных весна 2014 лекция 2
Алгоритмы и структуры данных весна 2014 лекция 2
Technopark
 
Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)
Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)
Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)
Mikhail Kurnosov
 
Алгоритмы и структуры данных осень 2013 лекция 2
Алгоритмы и структуры данных осень 2013 лекция 2Алгоритмы и структуры данных осень 2013 лекция 2
Алгоритмы и структуры данных осень 2013 лекция 2
Technopark
 

What's hot (20)

Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
 
Лекция 6: Биномиальные кучи (Binomial heaps)
Лекция 6: Биномиальные кучи (Binomial heaps)Лекция 6: Биномиальные кучи (Binomial heaps)
Лекция 6: Биномиальные кучи (Binomial heaps)
 
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
 
Лекция 4: Префиксные деревья (Tries, prefix trees)
Лекция 4: Префиксные деревья (Tries, prefix trees)Лекция 4: Префиксные деревья (Tries, prefix trees)
Лекция 4: Префиксные деревья (Tries, prefix trees)
 
Лекция 10. Биномиальные кучи (Binomial heaps)
Лекция 10. Биномиальные кучи (Binomial heaps)Лекция 10. Биномиальные кучи (Binomial heaps)
Лекция 10. Биномиальные кучи (Binomial heaps)
 
Лекция 8: Дерево Ван Эмде Боаса (Van Emde Boas tree)
Лекция 8: Дерево Ван Эмде Боаса (Van Emde Boas tree)Лекция 8: Дерево Ван Эмде Боаса (Van Emde Boas tree)
Лекция 8: Дерево Ван Эмде Боаса (Van Emde Boas tree)
 
Лекция 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)
 
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
 
Лекция 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)
 
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
 
Лекция 9: Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 9: Декартовы деревья (Treaps, дучи, дерамиды)Лекция 9: Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 9: Декартовы деревья (Treaps, дучи, дерамиды)
 
Лекция 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)
 
Лекция 11. Деревья отрезков (Interval trees)
Лекция 11. Деревья отрезков (Interval trees)Лекция 11. Деревья отрезков (Interval trees)
Лекция 11. Деревья отрезков (Interval trees)
 
Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки да...
Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки да...Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки да...
Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки да...
 
Алгоритмы и структуры данных весна 2014 лекция 2
Алгоритмы и структуры данных весна 2014 лекция 2Алгоритмы и структуры данных весна 2014 лекция 2
Алгоритмы и структуры данных весна 2014 лекция 2
 
Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)
Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)
Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)
 
Алгоритмы и структуры данных осень 2013 лекция 2
Алгоритмы и структуры данных осень 2013 лекция 2Алгоритмы и структуры данных осень 2013 лекция 2
Алгоритмы и структуры данных осень 2013 лекция 2
 
03 двоичные деревья поиска и очередь с приоритетами
03 двоичные деревья поиска и очередь с приоритетами03 двоичные деревья поиска и очередь с приоритетами
03 двоичные деревья поиска и очередь с приоритетами
 

Viewers also liked (6)

Лекция 4: Стек. Очередь
Лекция 4: Стек. ОчередьЛекция 4: Стек. Очередь
Лекция 4: Стек. Очередь
 
Лекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировкиЛекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировки
 
Визуализация графов: теорема Татта о барицентрической укладке
Визуализация графов: теорема Татта о барицентрической укладкеВизуализация графов: теорема Татта о барицентрической укладке
Визуализация графов: теорема Татта о барицентрической укладке
 
Лекция 1. Анализ эффективности алгоритмов
Лекция 1. Анализ эффективности алгоритмовЛекция 1. Анализ эффективности алгоритмов
Лекция 1. Анализ эффективности алгоритмов
 
Лекция 11: Методы разработки алгоритмов
Лекция 11: Методы разработки алгоритмовЛекция 11: Методы разработки алгоритмов
Лекция 11: Методы разработки алгоритмов
 
Оценка сложности алгоритма
Оценка сложности алгоритмаОценка сложности алгоритма
Оценка сложности алгоритма
 

More from Mikhail Kurnosov

More from Mikhail Kurnosov (20)

Векторизация кода (семинар 2)
Векторизация кода (семинар 2)Векторизация кода (семинар 2)
Векторизация кода (семинар 2)
 
Векторизация кода (семинар 3)
Векторизация кода (семинар 3)Векторизация кода (семинар 3)
Векторизация кода (семинар 3)
 
Векторизация кода (семинар 1)
Векторизация кода (семинар 1)Векторизация кода (семинар 1)
Векторизация кода (семинар 1)
 
Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMP
 
Лекция 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...
 
Лекция 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. Амортизационный анализ (amortized analysis)
Лекция 1. Амортизационный анализ (amortized analysis)Лекция 1. Амортизационный анализ (amortized analysis)
Лекция 1. Амортизационный анализ (amortized analysis)
 
Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)
 
Лекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмовЛекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмов
 
Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)
 
Лекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимостиЛекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимости
 
Семинар 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)
 

Recently uploaded

Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
Ирония безопасности
 
CVE. The Fortra's GoAnywhere MFT [RU].pdf
CVE. The Fortra's GoAnywhere MFT [RU].pdfCVE. The Fortra's GoAnywhere MFT [RU].pdf
CVE. The Fortra's GoAnywhere MFT [RU].pdf
Хроники кибер-безопасника
 
ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
Ирония безопасности
 
2023 Q4. The Ransomware report. [RU].pdf
2023 Q4. The Ransomware report. [RU].pdf2023 Q4. The Ransomware report. [RU].pdf
2023 Q4. The Ransomware report. [RU].pdf
Хроники кибер-безопасника
 
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdfСИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
Хроники кибер-безопасника
 
Cyberprint. Dark Pink Apt Group [RU].pdf
Cyberprint. Dark Pink Apt Group [RU].pdfCyberprint. Dark Pink Apt Group [RU].pdf
Cyberprint. Dark Pink Apt Group [RU].pdf
Хроники кибер-безопасника
 

Recently uploaded (9)

Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
 
Malware. DCRAT (DARK CRYSTAL RAT) [RU].pdf
Malware. DCRAT (DARK CRYSTAL RAT) [RU].pdfMalware. DCRAT (DARK CRYSTAL RAT) [RU].pdf
Malware. DCRAT (DARK CRYSTAL RAT) [RU].pdf
 
CVE. The Fortra's GoAnywhere MFT [RU].pdf
CVE. The Fortra's GoAnywhere MFT [RU].pdfCVE. The Fortra's GoAnywhere MFT [RU].pdf
CVE. The Fortra's GoAnywhere MFT [RU].pdf
 
ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
 
2023 Q4. The Ransomware report. [RU].pdf
2023 Q4. The Ransomware report. [RU].pdf2023 Q4. The Ransomware report. [RU].pdf
2023 Q4. The Ransomware report. [RU].pdf
 
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdfСИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
 
Ransomware_Q3 2023. The report [RU].pdf
Ransomware_Q3 2023.  The report [RU].pdfRansomware_Q3 2023.  The report [RU].pdf
Ransomware_Q3 2023. The report [RU].pdf
 
MS Navigating Incident Response [RU].pdf
MS Navigating Incident Response [RU].pdfMS Navigating Incident Response [RU].pdf
MS Navigating Incident Response [RU].pdf
 
Cyberprint. Dark Pink Apt Group [RU].pdf
Cyberprint. Dark Pink Apt Group [RU].pdfCyberprint. Dark Pink Apt Group [RU].pdf
Cyberprint. Dark Pink Apt Group [RU].pdf
 

Лекция 5: Бинарные деревья поиска

  • 1. Лекция 5 Бинарные деревья поиска Курносов Михаил Георгиевич к.т.н. доцент Кафедры вычислительных систем Сибирский государственный университет телекоммуникаций и информатики http://www.mkurnosov.net/teaching
  • 2. Структура данных “Словарь” (Dictionary)  Словарь (ассоциативный массив, associative array, map, dictionary) – структура (контейнер) данных для хранения пар вида “ключ – значение” (key – value) Ключ (Key) Значение (Value) 890 Слон 1200 Кит 260 Лев 530 Жираф 2
  • 3. Словарь Операция Add(map, key, value) Описание Помещает в словарь map пару (key, value) Lookup(map, key) Возвращает из словаря map значение ассоциированное с ключом key Remove(map, key) Удаляет из словаря map значение ассоциированное с ключом key Min(map) Возвращает из словаря map минимальное значение Max(map) Возвращает из словаря map максимальное значение 3
  • 4. Реализация АТД “Словарь”  Реализации словарей отличаются вычислительной сложностью операций добавления, поиска и удаления элементов  Наибольшее распространение получили следующие реализации: 1. Деревья поиска (Search trees) 2. Хэш-таблицы (Hash tables) 3. Связные списки 4. Массивы 4
  • 5. Реализация словаря на основе массива Операция Неотсортированный массив Отсортированный массив Add (map, key, value) O(1) (добавление в конец) O(n) (поиск позиции) Lookup (map, key) O(n) O(logn) (бинарный поиск) Remove (map, key) O(n) (поиск элемента и перенос последнего на место удаляемого) O(n) (перенос элементов) Min(map) O(n) O(1) (элемент v[1]) Max(map) O(n) O(1) (элемент v[n]) 5
  • 6. Реализация словаря на основе связного списка Операция Неотсортированный связный список Отсортированный связный список Add (map, key, value) O(1) (добавление в начало) O(n) (поиск позиции) Lookup (map, key) O(n) O(n) Remove (map, key) O(n) (поиск элемента) O(n) (перенос элементов) Min(map) O(n) O(1) O(n) O(n) или O(1), если поддерживать указатель на последний элемент Max(map) 6
  • 7. Бинарные деревья (Binary trees)  Двоичное дерево (Binary tree) – это дерево (структура данных), в которой каждый узел (node) имеет не более двух дочерних узлов (child nodes) Root node Depth 0 Parent node Child node Depth 1 Depth 2 Leaf node Depth 3 7
  • 8. Бинарные деревья поиска (Binary search trees)  Двоичное дерево поиска (Binary search tree, BST) – это двоичное дерево, в котором: 1) каждый узел x (node) имеет не более двух дочерних узлов (child nodes) и содержит ключ (key) и значение (value) 2) ключи всех узлов левого поддерева узла x меньше значения его ключа 3) ключи всех узлов правого поддерева узла x больше значения его ключа Key: 530 Value: Жираф Left Right 8
  • 9. Двоичные деревья поиска (Binary search trees) Словарь Двоичное дерево поиска Key: 530 Ключ (Key) Значение (Value) 530 Жираф 260 Лев Key: 260 Key: 890 890 Слон Value: Лев Value: Слон 1200 Кит Left Left Value: Жираф Left Right Right Right Key: 1200 Value: Кит Left Right 9
  • 10. Двоичные деревья поиска (Binary search trees) 180 Тигр 15 200 Барсук Лев 8 60 4000 Лиса Волк Слон 35 90 600 Рысь Ягуар Медведь Бинарное дерево поиска: 9 элементов, глубина (depth) = 3 Ordered map – упорядоченный ассоциативный массив 10
  • 11. Двоичные деревья поиска (Binary search trees) #include <stdio.h> #include <stdlib.h> struct bstree { int key; char *value; /* Ключ */ /* Данные */ struct bstree *left; struct bstree *right; }; 11
  • 12. Создание элемента BST struct bstree *bstree_create(int key, char *value) { struct bstree *node; node = malloc(sizeof(*node)); if (node != NULL) { node->key = key; node->value = value; node->left = NULL; node->right = NULL; } return node; } TCreate = O(1) 12
  • 13. Создание элемента BST int main() { struct bstree *tree; tree = bstree_create(180, "Tigr"); return 0; } 13
  • 14. Добавление элемента в BST 180 1. Добавление элемента (180, Тигр) Тигр 2. Добавление элемента (200, Лев) 3. Добавление элемента (15, Барсук) 15 200 Барсук Лев 4. Добавление элемента (60, Волк) 60 Волк Ищем листовой узел (leaf node) для вставки нового элемента 14
  • 15. Добавление элемента в BST void bstree_add(struct bstree *tree, int key, char *value) { struct bstree *parent, *node; if (tree == NULL) return; /* Отыскиваем листовой узел */ for (parent = tree; tree != NULL; ) { parent = tree; if (key < tree->key) tree = tree->left; else if (key > tree->key) tree = tree->right; else return; } 15
  • 16. Добавление элемента в BST (продолжение) /* Создаем элемент и связываем с узлом */ node = bstree_create(key, value); if (key < parent->key) parent->left = node; else parent->right = node; } TAdd = O(h)  При добавлении элемента необходимо спуститься от корня дерева до листа – это требует количества операций порядка высоты h дерева  Поиск листа – O(h), создание элемента и корректировка указателей – O(1) 16
  • 17. Поиск элемента в BST 1. Сравниваем ключ корневого узла с искомым. Если совпали, то элемент найден 2. Переходим к левому или правому дочернему узлу и повторяем шаг 1 180 Тигр 15 200 Барсук Лев 60 Волк Возможны рекурсивная и не рекурсивная реализации 17
  • 18. Поиск элемента в BST struct bstree *bstree_lookup(struct bstree *tree, int key) { while (tree != NULL) { if (key == tree->key) { return tree; } else if (key < tree->key) { tree = tree->left; } else { tree = tree->right; } } return tree; TLookup = O(h) } 18
  • 19. Поиск минимального элемента в BST   Минимальный элемент всегда расположен в левом поддереве корневого узла Требуется найти самого левого потомка корневого узла 180 Тигр 15 200 Барсук Лев 60 Волк 19
  • 20. Поиск минимального элемента в BST struct bstree *bstree_min(struct bstree *tree) { if (tree == NULL) return NULL; while (tree->left != NULL) tree = tree->left; return tree; } TMin = O(h) 20
  • 21. Поиск максимального элемента в BST   Максимальный элемент всегда расположен в правом поддереве корневого узла Требуется найти самого правого потомка корневого узла 180 Тигр 15 200 Барсук Лев 60 Волк 21
  • 22. Поиск максимального элемента в BST struct bstree *bstree_max(struct bstree *tree) { if (tree == NULL) return NULL; while (tree->right != NULL) tree = tree->right; return tree; } TMax = O(h) 22
  • 23. Пример int main() { struct bstree *tree, *node; tree = bstree_create(180, "Tigr"); bstree_add(tree, 200, "Lev"); bstree_add(tree, 60, "Volk"); node = bstree_lookup(tree, 200); printf(“Value = %sn", node->value); node = bstree_min(tree); printf("Min: value = %sn", node->value); return 0; } 23
  • 24. Удаление элемента из BST 180 1. Находим узел z с заданным ключом – O(n) Тигр 2. Возможны 3 ситуации: o узел z не имеет дочерних узлов 15 200 Барсук Лев o узел z имеет 1 дочерний узел o узел z имеет 2 дочерних узла 10 60 Заяц Волк 90 Кабан 24
  • 25. Удаление элемента из BST 180 Удаление узла “Лев” (случай 1) Тигр 1. Находим и удаляем узел “Лев” из памяти (free) 15 2. Родительский указатель (left или right) устанавливаем в зачение NULL “Тигр”->right = NULL 200 Барсук Лев 10 60 Заяц Волк 90 Кабан 25
  • 26. Удаление элемента из BST 180 Удаление узла “Волк” (случай 2) Тигр 1. Находим узел “Волк” 2. Родительский указатель узла “Волк” (left или right) устанавливаем на его дочерний элемент 3. Удаляем узле “Волк” из памяти “Барсук”->right = “Волк”->right 15 200 Барсук Лев 10 60 Заяц Волк 90 Кабан 26
  • 27. Удаление элемента из BST 180 Удаление узла “Барсук” (случай 3) Тигр 1. Находим узел “Барсук” 2. Находим узел с минимальным ключом в правом поддереве узла “Барсук” – самый левый лист в поддереве (узел “Рысь”) 15 200 Барсук Лев 10 60 Заяц Волк 90 45 Кабан Рысь 3. Заменяем узел “Барсук” узлом “Рысь” 55 70 150 Кабарга Тапир Марал 27
  • 28. Удаление элемента из BST Удаление узла “Барсук” (случай 3) 180 Тигр 180 Тигр 45 15 Барсук Рысь 200 200 Лев Лев 10 Заяц 10 60 Заяц 60 Волк Волк 90 Кабан 90 45 Кабан Рысь 55 55 70 150 Кабарга Тапир Марал 70 150 Кабарга Тапир Марал 28
  • 29. Анализ эффективность BST 1. Операции имеют трудоемкость пропорциональную высоте h дерева 1 Value 2. В худшем случае высота дерева O(n) (вставка элементов в отсортированной последовательности) NULL 2 Value 3. В среднем случае высота дерева O(logn) NULL 3 Value NULL bstree_add(tree, bstree_add(tree, bstree_add(tree, bstree_add(tree, “Item”, “Item”, “Item”, “Item”, 1); 2); 3); 4); 4 Value Дерево вырождается в связный список 29
  • 30. Реализация словаря на основе BST Операция Средний случай (average case) Худший случай (worst case) Add (map, key, value) O(logn) O(n) Lookup (map, key) O(logn) O(n) Remove (map, key) O(logn) O(n) Min(map) O(logn) O(n) Max(map) O(logn) O(n) 30
  • 31. Сбалансированные деревья поиска  Сбалансированное по высоте дерево поиска (self-balancing binary search tree) – дерево поиска, в котором высоты поддеревьев узла различаются не более чем на заданную константу k  Баланс высоты поддерживается при выполнении операций добавления и удаления элементов  Типы сбалансированных деревьев поиска:      Красно-черные деревья (Red-black tree): ℎ ≤ 2 log 2 (𝑛 + 1) АВЛ-деревья (AVL-tree): ℎ ≤ 1.44 ∙ log 2 𝑛; B-деревья Деревья Ван Эмде Боаса … Все операции на красно-черном дереве в худшем случае выполняются за время O(logn) 31
  • 32. Домашнее чтение  Прочитать в “практике программирования” [KR, С. 67] “2.8 Деревья”  Прочитать в [CLRS, С. 325] раздел об удалении узла из бинарного дерева поиска 32