SlideShare a Scribd company logo
Лекция 5:
B-деревья (B-trees)
Курносов Михаил Георгиевич
к.т.н. доцент Кафедры вычислительных систем
Сибирский государственный университет
телекоммуникаций и информатики
http://www.mkurnosov.net
Организация дисковой памяти
2
 Жёсткий диск (hard disk drive, HDD) –
это совокупность пластин (platters), которые хранят данные
в концентрических окружностях – дорожках (tracks)
 Данные считываются/записываются головками (heads)
 Пластины и головки приводятся в движение двигателями
 Сектор (Sector) – часть дорожки (минимально адресуемая
единица жесткого диска)
 Кластер (Cluster) – это совокупность секторов дорожки
 Цилиндр (Cylinder) – множество дорожек, размещенных
на одном и том же месте нескольких пластин
Организация дисковой памяти
3
 Время доступа к сектору (seek time) зависит от скорости
вращения пластин
Количество вращений в минуту
(Revolutions per minute, RPM)
Время доступа
(Rotational latency)
5400 rpm 0.011 сек.
7200 rpm 0.008 сек.
15 000 rpm 0.004 сек.
 Время доступа к оперативной памяти (≈ 10 нс) в 105 раз меньше
времени доступа к диску
Твердотельные накопители (SSD)
4
 Твердотельный накопитель
(Solid state drive, flash drive, SSD) –
это немеханическое запоминающее
устройство на основе микросхем памяти
 Время поиска блока на SSD (seek time) ≈ 0 сек
Организация дисковой памяти
5
 Для сокращения времени работы с диском данные читают
и записывают блоками – буферизованный ввод/вывод
 В алгоритмах для внешней памяти необходимо учитывать
количество обращений к диску
Структуры данных для внешней памяти
6
 Имеется бинарное дерево поиска (binary search tree),
в котором каждый узел содержит:
 ключ (key) – строка из 32 символов (char[32], 32 байта)
 значение (value) – целое число (int, 4 байта)
 указатели left и right (по 8 байт)
 Имеется сервер с 16 GiB оперативной памяти
 Сколько узлов дерева поместится в оперативную память?
Структуры данных для внешней памяти
7
 Имеется бинарное дерево поиска (binary search tree),
в котором каждый узел содержит:
 ключ (key) – строка из 32 символов (char[32], 32 байта)
 значение (value) – целое число (int, 4 байта)
 указатели left и right (по 8 байт)
 Имеется сервер с 16 GiB оперативной памяти
 Сколько узлов дерева поместится в оперативную память?
 Узел дерева занимает 32 + 4 + 8 + 8 = 52 байта
 Пусть нам доступны все 16 GiB (оценка сверху):
16 * 2^30 / 52 ≈ 330 382 099 узлов
Структуры данных для внешней памяти
8
 Как хранить словарь из 1 000 000 000 записей?
 Количество пользователей Facebook (июль 2013):
1 200 000 000
 Количество пользователей Google Gmail (июнь 2012):
425 000 000
 Количсество пользователей ВКонтакте (февраль 2013):
43 000 000
 Решение: использовать внешнюю память –
HDD/SSD-диски, сетевые хранилища
B-дерево (B-tree)
9
 B-дерево (B-tree) – это сбалансированное дерево поиска,
узлы которого хранятся во внешней памяти (например,
на диске HDD/SSD)
 В любой момент времени в оперативной памяти
находится лишь часть B-дерева (размер дерева может
значительно превышать объем оперативной памяти)
 B-деревья используются в файловых системах и системах
управления базами данных (СУБД)
 Авторы Rudolf Bayer и Edward M. McCreight
Boeing Research Labs, USA, 1971
 Буква “В” в названии B-деревьев: Boeing, Bayer, …
 Bayer R., McCreight E. Organization and Maintenance of Large Ordered Indices //
Math. and Information Sciences Report (Boeing Research Labs). – 1970, No. 20.
 Bayer R. Binary B-Trees for Virtual Memory // Workshop on Data Description, Access
and Control, 1971.
B-дерево (B-tree)
10
 Высота B-дерева не превышает O(logn), где n – количество
узлов в дереве
 Узлы B-дерева могут иметь много дочерних узлов –
до тысяч (сильно ветвящиеся деревья)
 Каждый узел B-дерева может содержать больше 1 ключа
 Если внутренний узел содержит k ключей, то у него k + 1
дочерних узлов
Один ключ
Два ключаДва ключа
B-дерево (B-tree)
11
key1, key2, …, key1000
key1, key2, …, key1000 key1, key2, …, key1000 key1, key2, …, key1000
1 2 … 1001
key1, key2, …, key1000 key1, key2, …, key1000 key1, key2, …, key1000
…
…
1 2 … 1001
root
3 уровня
1 + 1001 + 1001 * 1001 = 1 003 003 узлов
1000 + 1001 * 1000 + 1001 * 1001 * 1000 = 1 003 003 000 ключей
B-дерево (B-tree)
12
 B-дерево (B-tree) – это корневое дерево, обладающее
следующими свойствами:
1) Каждый узел содержит поля:
− количество n ключей, хранящихся в узле
− ключи key1, key2, …, keyn, упорядоченные по
не убыванию key1 ≤ key2 ≤ … ≤ keyn
− флаг leaf, равный true, если узел является листом
− внутренний узел содержит n + 1 указателей c1, c2, …, cn+1
на дочерние узлы (листья не имеют дочерних узлов)
B-дерево (B-tree)
13
 B-дерево (B-tree) – это корневое дерево, обладающее
следующими свойствами:
2) Ключи разделяют диапазоны ключей, хранящихся
в поддеревьях:
если ki – произвольный ключ в поддереве ci, то
k1 ≤ key1 ≤ k2 ≤ key2 ≤ … ≤ keyn ≤ kn+1
3) Все листья расположены на одинаковой глубине,
равной высоте h дерева
B-дерево (B-tree)
14
 B-дерево (B-tree) – это корневое дерево, обладающее
следующими свойствами:
4) Имеются нижняя и верхняя границы
количества ключей, хранящихся в узле –
минимальная степень t (minimum degree) B-дерева
− корневой узел содержит от 1 до 2t – 1 ключей
− каждый внутренний узел содержит минимум t – 1
ключей и минимум t дочерних узлов
− каждый узел содержит максимум 2t – 1 ключей и
максимум 2t дочерних узлов (за исключением листьев)
− узел заполнен (full), если он содержит 2t – 1 ключей
…
B-дерево (B-tree)
15
root
…t – 1 t – 1
t – 1
…
…t – 1 t – 1
t – 1
…
t – 1
…
…t – 1 t – 1
t – 1
…
…t – 1 t – 1
t – 1
…
t – 1
1Уровень: # узлов 0: 1
1: 2
2: 2t
3: 2t2
2-3-4-дерево (2-3-4 tree)
16
2-3-4-дерево (2-3-4 tree)
t = 2, каждый узел может иметь 2, 3 или 4 дочерних узла
Высота B-дерева
17
 Утверждение. Высота B-дерева с n ≥ 1 ключами
и минимальной степенью t ≥ 2 в худшем случае
не превышает logt((n + 1) / 2)
 Доказательство. Обозначим высоту B-дерева через h.
 Рассмотрим максимально высокое B-дерево:
в корне такого дерева хранится 1 ключ, а в остальных
узлах по t – 1 ключу (минимально возможное количество)
 На уровне 0 размещен один узел (корень) с 1 ключом
 На уровне 1: 2 узла (у каждого по t – 1 ключу)
 На уровне 2: 2t узлов
 На уровне 3: 2t2 узлов
 …
 На уровне h: 2th-1 узлов
Высота B-дерева
18
 Утверждение. Высота B-дерева с n ≥ 1 ключами
и минимальной степенью t ≥ 2 в худшем случае
не превышает logt((n + 1) / 2)
 Доказательство.
 Тогда, общее количество ключей есть
𝑛 = 1 + 𝑡 − 1 2 + 2𝑡 + 2𝑡2
+ 2𝑡3
+ ⋯ + 2𝑡ℎ−1
=
= 1 + 2 𝑡 − 1 1 + 𝑡 + 𝑡2 + ⋯ + 𝑡ℎ−1
 Сумма h первых членов геометрической прогрессии
𝑆ℎ =
𝑏1(𝑞ℎ − 1)
𝑞 − 1
Высота B-дерева
19
 Утверждение. Высота B-дерева с n ≥ 1 ключами
и минимальной степенью t ≥ 2 в худшем случае
не превышает logt((n + 1) / 2)
 Доказательство.
 Следовательно,
𝑛 = 1 + 2 𝑡 − 1
𝑡ℎ
− 1
𝑡 − 1
= 2𝑡ℎ
− 1
𝑛 + 1
2
= 𝑡ℎ
𝒉 = 𝐥𝐨𝐠 𝒕
𝒏 + 𝟏
𝟐
 Утверждение доказано.
Операции с B-деревьями
20
 Во всех операциях предполагаем следующее:
o корень B-дерева всегда находится в оперативной
памяти
o для чтения и записи данных на диск используются
процедуры DiskRead и DiskWrite
 Б-дерево минимизирует количество обращений к внешней
памяти (к DiskRead, DiskWrite)
Поиск элемента (Lookup)
21
1) Поиск начинаем с корня дерева. Для заданного ключа k
среди ключей текущего узла
key1 ≤ key2 ≤ … ≤ keyn
отыскиваем первый ключ keyi, такой что k ≤ keyi
2) Если k = keyi, то прекращаем поиск (узел найден)
3) Иначе, загружаем с диска (DiskRead) дочерний узел ci
и рекурсивного обследуем его ключи
4) Если достигли листа (leaf = true), завершаем работу
(ключ не найден)
Поиск элемента (Lookup)
22
function BTreeLookup(node, key)
i = 1
while i < n AND key > node.key[i] do
i = i + 1
end while
if i <= n AND key = node.key[i] then
return (node, i)
if node.leaf != TRUE then
child = DiskRead(node.c[i])
return BTreeLookup(child, key)
end if
return NULL
end function
Поиск элемента (Lookup)
23
function BTreeLookup(node, key)
i = 1
while i < n AND key > node.key[i] do
i = i + 1
end while
if i <= n AND key = node.key[i] then
return (node, i)
if node.leaf != TRUE then
child = DiskRead(node.c[i])
return BTreeLookup(child, key)
end if
return NULL
end function
O(t)
 Количество чтений с диска: 𝑇𝑅𝑒𝑎𝑑 = 𝑂 ℎ = 𝑂(log 𝑡 𝑛)
 Вычислительная сложность: 𝑇 = 𝑂 𝑡ℎ = 𝑂(𝑡 log 𝑡 𝑛)
Поиск элемента (Lookup)
24
function BTreeLookup(node, key)
i = 1
while i < n AND key > node.key[i] do
i = i + 1
end while
if i <= n AND key = node.key[i] then
return (node, i)
if node.leaf != TRUE then
child = DiskRead(node.c[i])
return BTreeLookup(child, key)
end if
return NULL
end function
O(t)
 Количество чтений с диска: 𝑇𝑅𝑒𝑎𝑑 = 𝑂 ℎ = 𝑂(log 𝑡 𝑛)
 Вычислительная сложность: 𝑇 = 𝑂 𝑡ℎ = 𝑂(𝑡 log 𝑡 𝑛)
Как ускорить поиск ключа в узле?
Поиск элемента (Lookup)
25
function BTreeLookup(node, key)
i = 1
while i < n AND key > node.key[i] do
i = i + 1
end while
if i <= n AND key = node.key[i] then
return (node, i)
if node.leaf != TRUE then
child = DiskRead(node.c[i])
return BTreeLookup(child, key)
end if
return NULL
end function
O(t)
 Количество чтений с диска: 𝑇𝑅𝑒𝑎𝑑 = 𝑂 ℎ = 𝑂(log 𝑡 𝑛)
 Вычислительная сложность: 𝑇 = 𝑂 𝑡ℎ = 𝑂(𝑡 log 𝑡 𝑛)
Как ускорить поиск ключа в узле?
Двоичный поиск (Binary search) за время O(log2t)
T = O(log2t ∙ logtn)
Создание пустого B-дерева (Create)
26
function BTreeCreate()
node = DiskAllocateNode()
node.leaf = TRUE
node.n = 0
DiskWrite(node)
end function
 Количество дисковых операций: 𝑇 𝐷𝑖𝑠𝑘 = 𝑂 1
 Вычислительная сложность: 𝑇 = 𝑂 1
1) Выделить на диске место для корневого узла
2) Заполнить поля корневого узла
Добавление ключа (Insert)
27
1) Для заданного ключа key находим лист для вставки
нового элемента
2) Если лист не заполнен (ключей меньше или равно 2t – 1),
то вставляем ключ в узел (сохраняя упорядоченность
ключей)
2 4
31 5
B-дерево
Вставка ключа 6
Добавление ключа (Insert)
28
3) Если лист заполнен (содержит 2t – 1 ключей), то
разбиваем его (split) на 2 листа по t – 1 ключей –
среди ключей листа key1 ≤ key2 ≤ … ≤ keyn и ключа key
отыскиваем медиану (median key) – средний ключ
разделитель
4) Ключ медиана вставляется в родительский узел.
Если родительский узел заполнен, то он разбивается и
процедура повторяется по описанной выше схеме.
Подъем вверх по дереву может продолжаться до корня
Добавление ключа (Insert) в 2-3 B-дерево
29
4
5 7
62
1 3
5 6
2 4
1 3
5
2 4
1 3
2
1 3 4
2
1 3
1 2
1
Ключ 1
Ключ 2
Ключ 3
разбиение 1, 2, 3
Ключ 4
Ключ 5
разбиение 3, 4, 5
Ключ 6
Ключ 7
разбиение 5, 6, 7;
разбиение 2, 4, 6
Добавление ключа (Insert)
30
 При проходе от корня дерева к искомому листу
разбиваем (split) все заполненные узлы, через которые
проходим (включая лист).
 Это гарантирует, что если понадобится разбить узел,
то его родительский узел не будет заполнен
Разбиение узла (Split)
31
function BTreeSplitNode(node, parent, i)
z = DiskAllocateNode()
z.leaf = node.leaf
z.n = t – 1
/* Половина ключей перемещаются в новый узел */
for j = 1 to t – 1 do
z.key[j] = node.key[t + j]
end for
if node.leaf = FALSE then
for j = 1 to t do
z.c[j] = node.c[t + j]
end for
end if
Разбиение узла (Split)
/* В node остается меньшая половина ключей */
node.n = t – 1
/* Вставляем ключ в родительский узел */
for j = parent.n + 1 downto i + 1 do
parent.c[j + 1] = parent.c[j]
end for
parent.c[i + 1] = z
for j = parent.n downto i do
parent.key[j + 1] = parent.key[j]
end for
parent.key[i] = node.key[t]
parent.n = parent.n + 1
DiskWrite(node)
DiskWrite(z)
DiskWrite(parent)
end function
32
TSplitNode = O(t)
TDisk = O(1)
Добавление ключа (Insert)
33
function BTreeInsert(root, key)
if root.n = 2t – 1 then
newroot = DiskAllocateNode()
newroot.leaf = FALSE
newroot.n = 0
newroot.c[1] = root
BTreeSplitNode(root, newroot, 1)
return BTreeInsertNonfull(newroot, key)
end if
return BTreeInsertNonfull(root, key)
end function
Добавление ключа (Insert)
function BTreeInsertNonfull(node, key)
i = node.n
if node.leaf = TRUE then
while i > 1 AND key < node.key[i] do
node.key[i + 1] = node.key[i]
i = i - 1
end while
node.key[i + 1] = key
node.n = node.n + 1
DiskWrite(node)
else
while i > 1 AND key < node.key[i] do
i = i - 1
end while
i = i + 1
DiskRead(node.c[i])
34
Добавление ключа (Insert)
35
if node.c[i].n = 2t – 1 then
BTreeSplitNode(node.c[i], node, i)
if key > node.key[i] then
i = i + 1
end if
end if
node = BTreeInsertNonfull(node.c[i], key)
end if
return node
end function
 Вычислительная сложность вставки ключа в B-дерево
в худшем случае (разбиваем узлы на каждом уровне):
𝑇 = 𝑂 𝑡ℎ = 𝑂(𝑡 log 𝑡 𝑛)
 Количество дисковых операций:
𝑇 𝐷𝑖𝑠𝑘 = 𝑂 ℎ = 𝑂(log 𝑡 𝑛)
Удаление ключа (Delete)
36
 Находим узел, содержащий искомый ключ key
 Если ключ key находится в листе, то удаляем ключ из него
 Если количество ключей стало меньше t – 1, выполняем
восстановление свойств B-дерева
 …
Изучить самостоятельно [CLRS, С. 530]
Виды B-деревьев
37
 B+-дерево (B+-tree) – это B-дерево, в котором только листья
содержат информацию, а внутренние узлы хранят только
ключи
 Примнение: храннеие
 B*-дерево (B*-tree) – это B-дерево, в котором каждый узел
(за исключением корня) должен содержать не менее 2/3
ключей, а не 1/2 как в B-дереве
Применение B-деревьев
38
 B+-деревья:
o индексация метаданных в файловых системах
NTFS, ReiserFS, NSS, XFS, JFS
o индексы таблиц в СУБД IBM DB2, Informix, Microsoft
SQL Server, Oracle 8, Sybase ASE, SQLite
Реализация 2-3-4 B-tree
39
/* Minimum degree of B-tree */
#define T 2 /* 2-3-4 B-tree */
struct btree {
int leaf;
int nkeys;
int *key;
int *value;
struct btree **child;
};
Реализация B-tree
40
struct btree *btree_create()
{
struct btree *node;
node = malloc(sizeof(*node));
node->leaf = 1;
node->nkeys = 0;
node->key = malloc(sizeof(*node->key) *
2 * T - 1);
node->value = malloc(sizeof(*node->value) *
2 * T - 1);
node->child = malloc(sizeof(*node->child) *
2 * T);
return node;
}
Реализация B-tree
void btree_lookup(struct btree *tree, int key,
struct btree **node, int *index)
{
int i;
for (i = 0; i < tree->nkeys && key > tree->key[i]; ) {
i++;
}
if (i < tree->nkeys && key == tree->key[i]) {
*node = tree;
*index = i;
return;
}
if (!tree->leaf) {
/* Disk read tree->child[i] */
btree_lookup(tree, key, node, index);
} else {
*node = NULL;
}
} 41
Реализация B-tree
struct btree *btree_insert(struct btree *tree,
int key, int value)
{
struct btree *newroot;
if (tree == NULL) {
tree = btree_create();
tree->nkeys = 1;
tree->key[0] = key;
tree->value[0] = value;
return tree;
}
if (tree->nkeys == 2 * T - 1) {
newroot = btree_create(); /* Create empty root */
newroot->leaf = 0;
newroot->child[0] = tree;
btree_split_node(tree, newroot, 0);
return btree_insert_nonfull(newroot, key, value);
}
return btree_insert_nonfull(tree, key, value);
} 42
Реализация B-tree
void btree_split_node(struct btree *node,
struct btree *parent, int index)
{
struct btree *z;
int i;
z = btree_create();
z->leaf = node->leaf;
z->nkeys = T - 1;
for (i = 0; i < T - 1; i++) {
z->key[i] = node->key[T + i];
z->value[i] = node->value[T + i];
}
if (!node->leaf) {
for (i = 0; i < T; i++)
z->child[i] = node->child[i + T];
}
node->nkeys = T - 1;
43
Реализация B-tree
/* Insert median key into parent node */
for (i = parent->nkeys; i >= 0 && i <= index + 1; i--)
parent->child[i + 1] = parent->child[i];
parent->child[index + 1] = z;
for (i = parent->nkeys - 1; i >= 0 && i <= index; i--) {
parent->key[i + 1] = parent->key[i];
parent->value[i + 1] = parent->value[i];
}
parent->key[index] = node->key[T - 1];
parent->value[index] = node->value[T - 1];
parent->nkeys++;
/* Write to disk: node, z, parent */
}
44
Реализация B-tree
struct btree *btree_insert_nonfull(
struct btree *node, int key, int value)
{
int i;
i = node->nkeys;
if (node->leaf) {
for (i = node->nkeys - 1; i > 0 &&
key < node->key[i]; i--)
{
node->key[i + 1] = node->key[i];
}
node->key[i + 1] = key;
node->nkeys++;
} else {
45
Реализация B-tree
for (i = node->nkeys - 1; i > 0 &&
key < node->key[i]; )
{
i--;
}
i++;
if (node->child[i]->nkeys == 2 * T - 1) {
btree_split_node(node->child[i], node, i);
if (key > node->key[i])
i++;
}
node = btree_insert_nonfull(node->child[i],
key, value);
}
return node;
}
46
Реализация B-tree
int main()
{
struct btree *tree;
tree = btree_insert(NULL, 3, 0);
tree = btree_insert(tree, 12, 0);
tree = btree_insert(tree, 9, 0);
tree = btree_insert(tree, 18, 0);
return 0;
}
47
Внешняя сортировка слиянием
48
 Внешняя сортировка (External sorting) – это класс алгоритмов
сортировки, которые оперируют данными размещенными на внешней
памяти
 Как отсортировать 300 GiB данных на жестком диске
имея 2 GiB оперативной памяти?
Внешняя сортировка слиянием
49
 Внешняя сортировка (External sorting) – это класс алгоритмов
сортировки, которые оперируют данными размещенными на внешней
памяти
 Как отсортировать 300 GiB данных на жестком диске
имея 2 GiB оперативной памяти?
1. Загружаем блок размером 2 GiB в оперативную память
2. Сортируем блок (MergeSort, QuickSort, CountingSort, …) и сохраняем
на нешнюю память (диск)
3. Повторяем шаги 1 и 2, пока на получим 300 / 2 = 150 отсортированных
блоков на внешней памяти
4. Создаем в оперативной памяти 151 буфер по 13 KiB (2 GiB / 151 ≈ 13 KiB)
5. Загружаем в 150 буферов по 13 KiB из отсортированных блоков, 151-й
буфер – это выходной блок
6. В выходной блок сливаем (merge) данные из 150 буферов и записываем
его на внешнюю память
7. Повторяем шаги 5 и 6 пока не сольем все 150 блоков
Внешняя сортировка слиянием
50
 Внешняя сортировка (External sorting) – это класс алгоритмов
сортировки, которые оперируют данными размещенными на внешней
памяти
 Как отсортировать 300 GiB данных на жестком диске
имея 2 GiB оперативной памяти?
1. Загружаем блок размером 2 GiB в оперативную память
2. Сортируем блок (MergeSort, QuickSort, CountingSort, …) и сохраняем
на нешнюю память (диск)
3. Повторяем шаги 1 и 2, пока на получим 300 / 2 = 150 отсортированных
блоков на внешней памяти
4. Создаем в оперативной памяти 151 буфер по 13 KiB (2 GiB / 151 ≈ 13 KiB)
5. Загружаем в 150 буферов по 13 KiB из отсортированных блоков, 151-й
буфер – это выходной блок
6. В выходной блок сливаем (merge) данные из 150 буферов и записываем
его на внешнюю память
7. Повторяем шаги 5 и 6 пока не сольем все 150 блоков
k-way merge sort
k = 300 GiB / 2 GiB = 150
150-way merge sort
Задания
51
 Рассмотреть применение B-деревьев в файловых
системах – что содержит поле “ключ” (key)
и поле “значение” (value)
 Привести пример значения t, используемого в файловой
системе Btrfs
 Изучить применение B-деревьев в системах управления
базами данных (MySQL, PostgreSQL, Microsoft SQL Server,
IBM DB2 и др.): какие задачи они решают, что хранится
в поле “ключ” (key) и поле “значение” (value)
Ad

More Related Content

What's hot (12)

Focus schèmes & compétences P. Clauzard
Focus schèmes & compétences  P. ClauzardFocus schèmes & compétences  P. Clauzard
Focus schèmes & compétences P. Clauzard
philip61
 
英語発表のススメ その3:英語抄録を書くときのちょっとしたコツ
英語発表のススメ その3:英語抄録を書くときのちょっとしたコツ英語発表のススメ その3:英語抄録を書くときのちょっとしたコツ
英語発表のススメ その3:英語抄録を書くときのちょっとしたコツ
KenichiKokubo
 
Cygwin+and+open ssl+install+guide
Cygwin+and+open ssl+install+guideCygwin+and+open ssl+install+guide
Cygwin+and+open ssl+install+guide
ganaaturuu
 
DNSH - Edilizia 1402 - Introduzione alla Guida Operativa (1).pptx
DNSH - Edilizia 1402 - Introduzione alla Guida Operativa (1).pptxDNSH - Edilizia 1402 - Introduzione alla Guida Operativa (1).pptx
DNSH - Edilizia 1402 - Introduzione alla Guida Operativa (1).pptx
AlbertoAzzarito
 
Introduction to 3D Computer Vision and Differentiable Rendering
Introduction to 3D Computer Vision and Differentiable RenderingIntroduction to 3D Computer Vision and Differentiable Rendering
Introduction to 3D Computer Vision and Differentiable Rendering
Preferred Networks
 
Parallel Algorithms for Trees
Parallel Algorithms for TreesParallel Algorithms for Trees
Parallel Algorithms for Trees
Ahmad Khayyat
 
[SIGGRAPH 2021] Dynamic Closest Color Warping to Sort and Compare Palettes
[SIGGRAPH 2021] Dynamic Closest Color Warping to Sort and Compare Palettes[SIGGRAPH 2021] Dynamic Closest Color Warping to Sort and Compare Palettes
[SIGGRAPH 2021] Dynamic Closest Color Warping to Sort and Compare Palettes
Suzi Kim
 
StyleCLIP: Text-Driven Manipulation of StyleGAN Imagery
StyleCLIP: Text-Driven Manipulation of StyleGAN Imagery StyleCLIP: Text-Driven Manipulation of StyleGAN Imagery
StyleCLIP: Text-Driven Manipulation of StyleGAN Imagery
ivaderivader
 
Creative coding with d3.js
Creative coding with d3.jsCreative coding with d3.js
Creative coding with d3.js
Fabian Dubois
 
что такое программирование?
что такое программирование?что такое программирование?
что такое программирование?
TenelQasimli
 
The life changing magic of tidying up your data: The art and science of makin...
The life changing magic of tidying up your data: The art and science of makin...The life changing magic of tidying up your data: The art and science of makin...
The life changing magic of tidying up your data: The art and science of makin...
removed_62798267384a091db5c693ad7f1cc5ac
 
N Queen Problem using Branch And Bound - GeeksforGeeks.pdf
N Queen Problem using Branch And Bound - GeeksforGeeks.pdfN Queen Problem using Branch And Bound - GeeksforGeeks.pdf
N Queen Problem using Branch And Bound - GeeksforGeeks.pdf
akashreddy966699
 
Focus schèmes & compétences P. Clauzard
Focus schèmes & compétences  P. ClauzardFocus schèmes & compétences  P. Clauzard
Focus schèmes & compétences P. Clauzard
philip61
 
英語発表のススメ その3:英語抄録を書くときのちょっとしたコツ
英語発表のススメ その3:英語抄録を書くときのちょっとしたコツ英語発表のススメ その3:英語抄録を書くときのちょっとしたコツ
英語発表のススメ その3:英語抄録を書くときのちょっとしたコツ
KenichiKokubo
 
Cygwin+and+open ssl+install+guide
Cygwin+and+open ssl+install+guideCygwin+and+open ssl+install+guide
Cygwin+and+open ssl+install+guide
ganaaturuu
 
DNSH - Edilizia 1402 - Introduzione alla Guida Operativa (1).pptx
DNSH - Edilizia 1402 - Introduzione alla Guida Operativa (1).pptxDNSH - Edilizia 1402 - Introduzione alla Guida Operativa (1).pptx
DNSH - Edilizia 1402 - Introduzione alla Guida Operativa (1).pptx
AlbertoAzzarito
 
Introduction to 3D Computer Vision and Differentiable Rendering
Introduction to 3D Computer Vision and Differentiable RenderingIntroduction to 3D Computer Vision and Differentiable Rendering
Introduction to 3D Computer Vision and Differentiable Rendering
Preferred Networks
 
Parallel Algorithms for Trees
Parallel Algorithms for TreesParallel Algorithms for Trees
Parallel Algorithms for Trees
Ahmad Khayyat
 
[SIGGRAPH 2021] Dynamic Closest Color Warping to Sort and Compare Palettes
[SIGGRAPH 2021] Dynamic Closest Color Warping to Sort and Compare Palettes[SIGGRAPH 2021] Dynamic Closest Color Warping to Sort and Compare Palettes
[SIGGRAPH 2021] Dynamic Closest Color Warping to Sort and Compare Palettes
Suzi Kim
 
StyleCLIP: Text-Driven Manipulation of StyleGAN Imagery
StyleCLIP: Text-Driven Manipulation of StyleGAN Imagery StyleCLIP: Text-Driven Manipulation of StyleGAN Imagery
StyleCLIP: Text-Driven Manipulation of StyleGAN Imagery
ivaderivader
 
Creative coding with d3.js
Creative coding with d3.jsCreative coding with d3.js
Creative coding with d3.js
Fabian Dubois
 
что такое программирование?
что такое программирование?что такое программирование?
что такое программирование?
TenelQasimli
 
The life changing magic of tidying up your data: The art and science of makin...
The life changing magic of tidying up your data: The art and science of makin...The life changing magic of tidying up your data: The art and science of makin...
The life changing magic of tidying up your data: The art and science of makin...
removed_62798267384a091db5c693ad7f1cc5ac
 
N Queen Problem using Branch And Bound - GeeksforGeeks.pdf
N Queen Problem using Branch And Bound - GeeksforGeeks.pdfN Queen Problem using Branch And Bound - GeeksforGeeks.pdf
N Queen Problem using Branch And Bound - GeeksforGeeks.pdf
akashreddy966699
 

Viewers also liked (20)

Лекция 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
 
Векторизация кода (семинар 2)
Векторизация кода (семинар 2)Векторизация кода (семинар 2)
Векторизация кода (семинар 2)
Mikhail Kurnosov
 
Индексы в MySQL
Индексы в MySQLИндексы в MySQL
Индексы в MySQL
Pavel Zyukin
 
Оптимизация SQL-запросов
Оптимизация SQL-запросовОптимизация SQL-запросов
Оптимизация SQL-запросов
tssoft
 
Bigtable and Boxwood
Bigtable and BoxwoodBigtable and Boxwood
Bigtable and Boxwood
Evan Weaver
 
Oracle DBA Online Training in India
Oracle DBA Online Training in IndiaOracle DBA Online Training in India
Oracle DBA Online Training in India
united global soft
 
Top 10 Oracle SQL tuning tips
Top 10 Oracle SQL tuning tipsTop 10 Oracle SQL tuning tips
Top 10 Oracle SQL tuning tips
Nirav Shah
 
1.9 b tree
1.9 b tree1.9 b tree
1.9 b tree
Krish_ver2
 
Network Forensics
Network ForensicsNetwork Forensics
Network Forensics
primeteacher32
 
Tpr star tree
Tpr star treeTpr star tree
Tpr star tree
Win Yu
 
B trees
B treesB trees
B trees
PRAKASH RANJAN SINGH
 
UFADevCom'13#1 Шерыхалин Олег
UFADevCom'13#1 Шерыхалин ОлегUFADevCom'13#1 Шерыхалин Олег
UFADevCom'13#1 Шерыхалин Олег
UFADevCom
 
HighLoad systems: tips & tricks
HighLoad systems: tips & tricksHighLoad systems: tips & tricks
HighLoad systems: tips & tricks
Sveta Bozhko
 
PHP Anamnes 2015
PHP Anamnes 2015PHP Anamnes 2015
PHP Anamnes 2015
Aleh Kot
 
Algorithm Introduction #18 B-Tree
Algorithm Introduction #18 B-TreeAlgorithm Introduction #18 B-Tree
Algorithm Introduction #18 B-Tree
Satoshi Asano
 
floor planning
floor planningfloor planning
floor planning
Team-VLSI-ITMU
 
CAD: introduction to floorplanning
CAD:  introduction to floorplanningCAD:  introduction to floorplanning
CAD: introduction to floorplanning
Team-VLSI-ITMU
 
High load для начинающих
High load для начинающихHigh load для начинающих
High load для начинающих
Andrew Minkin
 
Алексей Иванкин: Highload + PHP
Алексей Иванкин: Highload + PHPАлексей Иванкин: Highload + PHP
Алексей Иванкин: Highload + PHP
Oleg Poludnenko
 
Лекция 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
 
Векторизация кода (семинар 2)
Векторизация кода (семинар 2)Векторизация кода (семинар 2)
Векторизация кода (семинар 2)
Mikhail Kurnosov
 
Индексы в MySQL
Индексы в MySQLИндексы в MySQL
Индексы в MySQL
Pavel Zyukin
 
Оптимизация SQL-запросов
Оптимизация SQL-запросовОптимизация SQL-запросов
Оптимизация SQL-запросов
tssoft
 
Bigtable and Boxwood
Bigtable and BoxwoodBigtable and Boxwood
Bigtable and Boxwood
Evan Weaver
 
Oracle DBA Online Training in India
Oracle DBA Online Training in IndiaOracle DBA Online Training in India
Oracle DBA Online Training in India
united global soft
 
Top 10 Oracle SQL tuning tips
Top 10 Oracle SQL tuning tipsTop 10 Oracle SQL tuning tips
Top 10 Oracle SQL tuning tips
Nirav Shah
 
Tpr star tree
Tpr star treeTpr star tree
Tpr star tree
Win Yu
 
UFADevCom'13#1 Шерыхалин Олег
UFADevCom'13#1 Шерыхалин ОлегUFADevCom'13#1 Шерыхалин Олег
UFADevCom'13#1 Шерыхалин Олег
UFADevCom
 
HighLoad systems: tips & tricks
HighLoad systems: tips & tricksHighLoad systems: tips & tricks
HighLoad systems: tips & tricks
Sveta Bozhko
 
PHP Anamnes 2015
PHP Anamnes 2015PHP Anamnes 2015
PHP Anamnes 2015
Aleh Kot
 
Algorithm Introduction #18 B-Tree
Algorithm Introduction #18 B-TreeAlgorithm Introduction #18 B-Tree
Algorithm Introduction #18 B-Tree
Satoshi Asano
 
CAD: introduction to floorplanning
CAD:  introduction to floorplanningCAD:  introduction to floorplanning
CAD: introduction to floorplanning
Team-VLSI-ITMU
 
High load для начинающих
High load для начинающихHigh load для начинающих
High load для начинающих
Andrew Minkin
 
Алексей Иванкин: Highload + PHP
Алексей Иванкин: Highload + PHPАлексей Иванкин: Highload + PHP
Алексей Иванкин: Highload + PHP
Oleg Poludnenko
 
Ad

Similar to Лекция 5: B-деревья (B-trees, k-way merge sort) (20)

Лекция 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
 
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Mikhail Kurnosov
 
Лекция №11. Работа с внешней памятью (файлами). Предмет "Структуры и алгоритм...
Лекция №11. Работа с внешней памятью (файлами). Предмет "Структуры и алгоритм...Лекция №11. Работа с внешней памятью (файлами). Предмет "Структуры и алгоритм...
Лекция №11. Работа с внешней памятью (файлами). Предмет "Структуры и алгоритм...
Nikolay Grebenshikov
 
Лекция 8: Дерево Ван Эмде Боаса (Van Emde Boas tree)
Лекция 8: Дерево Ван Эмде Боаса (Van Emde Boas tree)Лекция 8: Дерево Ван Эмде Боаса (Van Emde Boas tree)
Лекция 8: Дерево Ван Эмде Боаса (Van Emde Boas tree)
Mikhail Kurnosov
 
Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)
Mikhail Kurnosov
 
Лекция 9. Дерево ван Эмде Боаса (van Emde Boas tree)
Лекция 9. Дерево ван Эмде Боаса (van Emde Boas tree)Лекция 9. Дерево ван Эмде Боаса (van Emde Boas tree)
Лекция 9. Дерево ван Эмде Боаса (van Emde Boas tree)
Mikhail Kurnosov
 
Лекция 4. Префиксные деревья (Tries, prefix trees)
Лекция 4. Префиксные деревья (Tries, prefix trees)Лекция 4. Префиксные деревья (Tries, prefix trees)
Лекция 4. Префиксные деревья (Tries, prefix trees)
Mikhail Kurnosov
 
Лекция 9: Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 9: Декартовы деревья (Treaps, дучи, дерамиды)Лекция 9: Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 9: Декартовы деревья (Treaps, дучи, дерамиды)
Mikhail Kurnosov
 
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Mikhail Kurnosov
 
Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки да...
Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки да...Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки да...
Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки да...
Nikolay Grebenshikov
 
компьютерра
компьютерракомпьютерра
компьютерра
bukish
 
компьютерра
компьютерракомпьютерра
компьютерра
bukish
 
Лекция 4: Префиксные деревья (Tries, prefix trees)
Лекция 4: Префиксные деревья (Tries, prefix trees)Лекция 4: Префиксные деревья (Tries, prefix trees)
Лекция 4: Префиксные деревья (Tries, prefix trees)
Mikhail Kurnosov
 
структура данных на магнитных дисках
структура данных на магнитных дискахструктура данных на магнитных дисках
структура данных на магнитных дисках
masik22
 
Архитектура и программирование потоковых многоядерных процессоров для научных...
Архитектура и программирование потоковых многоядерных процессоров для научных...Архитектура и программирование потоковых многоядерных процессоров для научных...
Архитектура и программирование потоковых многоядерных процессоров для научных...
a15464321646213
 
Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?
Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?
Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?
tfmailru
 
Лекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные спискиЛекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные списки
Mikhail Kurnosov
 
деревья
деревьядеревья
деревья
Mariya_Lastochkina
 
Лекция 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
 
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Mikhail Kurnosov
 
Лекция №11. Работа с внешней памятью (файлами). Предмет "Структуры и алгоритм...
Лекция №11. Работа с внешней памятью (файлами). Предмет "Структуры и алгоритм...Лекция №11. Работа с внешней памятью (файлами). Предмет "Структуры и алгоритм...
Лекция №11. Работа с внешней памятью (файлами). Предмет "Структуры и алгоритм...
Nikolay Grebenshikov
 
Лекция 8: Дерево Ван Эмде Боаса (Van Emde Boas tree)
Лекция 8: Дерево Ван Эмде Боаса (Van Emde Boas tree)Лекция 8: Дерево Ван Эмде Боаса (Van Emde Boas tree)
Лекция 8: Дерево Ван Эмде Боаса (Van Emde Boas tree)
Mikhail Kurnosov
 
Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)
Mikhail Kurnosov
 
Лекция 9. Дерево ван Эмде Боаса (van Emde Boas tree)
Лекция 9. Дерево ван Эмде Боаса (van Emde Boas tree)Лекция 9. Дерево ван Эмде Боаса (van Emde Boas tree)
Лекция 9. Дерево ван Эмде Боаса (van Emde Boas tree)
Mikhail Kurnosov
 
Лекция 4. Префиксные деревья (Tries, prefix trees)
Лекция 4. Префиксные деревья (Tries, prefix trees)Лекция 4. Префиксные деревья (Tries, prefix trees)
Лекция 4. Префиксные деревья (Tries, prefix trees)
Mikhail Kurnosov
 
Лекция 9: Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 9: Декартовы деревья (Treaps, дучи, дерамиды)Лекция 9: Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 9: Декартовы деревья (Treaps, дучи, дерамиды)
Mikhail Kurnosov
 
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Mikhail Kurnosov
 
Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки да...
Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки да...Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки да...
Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки да...
Nikolay Grebenshikov
 
компьютерра
компьютерракомпьютерра
компьютерра
bukish
 
компьютерра
компьютерракомпьютерра
компьютерра
bukish
 
Лекция 4: Префиксные деревья (Tries, prefix trees)
Лекция 4: Префиксные деревья (Tries, prefix trees)Лекция 4: Префиксные деревья (Tries, prefix trees)
Лекция 4: Префиксные деревья (Tries, prefix trees)
Mikhail Kurnosov
 
структура данных на магнитных дисках
структура данных на магнитных дискахструктура данных на магнитных дисках
структура данных на магнитных дисках
masik22
 
Архитектура и программирование потоковых многоядерных процессоров для научных...
Архитектура и программирование потоковых многоядерных процессоров для научных...Архитектура и программирование потоковых многоядерных процессоров для научных...
Архитектура и программирование потоковых многоядерных процессоров для научных...
a15464321646213
 
Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?
Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?
Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?
tfmailru
 
Лекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные спискиЛекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные списки
Mikhail Kurnosov
 
Ad

More from Mikhail Kurnosov (20)

Векторизация кода (семинар 3)
Векторизация кода (семинар 3)Векторизация кода (семинар 3)
Векторизация кода (семинар 3)
Mikhail Kurnosov
 
Векторизация кода (семинар 1)
Векторизация кода (семинар 1)Векторизация кода (семинар 1)
Векторизация кода (семинар 1)
Mikhail Kurnosov
 
Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)
Mikhail Kurnosov
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMP
Mikhail Kurnosov
 
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
Mikhail Kurnosov
 
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Mikhail Kurnosov
 
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
Mikhail Kurnosov
 
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
Mikhail Kurnosov
 
Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)
Mikhail Kurnosov
 
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Mikhail Kurnosov
 
Лекция 1. Амортизационный анализ (amortized analysis)
Лекция 1. Амортизационный анализ (amortized analysis)Лекция 1. Амортизационный анализ (amortized analysis)
Лекция 1. Амортизационный анализ (amortized analysis)
Mikhail Kurnosov
 
Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)
Mikhail Kurnosov
 
Лекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмовЛекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмов
Mikhail Kurnosov
 
Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)
Mikhail Kurnosov
 
Лекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимостиЛекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимости
Mikhail Kurnosov
 
Семинар 10. Параллельное программирование на MPI (часть 3)
Семинар 10. Параллельное программирование на MPI (часть 3)Семинар 10. Параллельное программирование на MPI (часть 3)
Семинар 10. Параллельное программирование на MPI (часть 3)
Mikhail Kurnosov
 
Семинар 9. Параллельное программирование на MPI (часть 2)
Семинар 9. Параллельное программирование на MPI (часть 2)Семинар 9. Параллельное программирование на MPI (часть 2)
Семинар 9. Параллельное программирование на MPI (часть 2)
Mikhail Kurnosov
 
Лекция 9. Поиск кратчайшего пути в графе
Лекция 9. Поиск кратчайшего пути в графеЛекция 9. Поиск кратчайшего пути в графе
Лекция 9. Поиск кратчайшего пути в графе
Mikhail Kurnosov
 
Семинар 8. Параллельное программирование на MPI (часть 1)
Семинар 8. Параллельное программирование на MPI (часть 1)Семинар 8. Параллельное программирование на MPI (часть 1)
Семинар 8. Параллельное программирование на MPI (часть 1)
Mikhail Kurnosov
 
Лекция 8. Графы. Обходы графов
Лекция 8. Графы. Обходы графовЛекция 8. Графы. Обходы графов
Лекция 8. Графы. Обходы графов
Mikhail Kurnosov
 
Векторизация кода (семинар 3)
Векторизация кода (семинар 3)Векторизация кода (семинар 3)
Векторизация кода (семинар 3)
Mikhail Kurnosov
 
Векторизация кода (семинар 1)
Векторизация кода (семинар 1)Векторизация кода (семинар 1)
Векторизация кода (семинар 1)
Mikhail Kurnosov
 
Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)
Mikhail Kurnosov
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMP
Mikhail Kurnosov
 
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
Mikhail Kurnosov
 
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Mikhail Kurnosov
 
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
Mikhail Kurnosov
 
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
Mikhail Kurnosov
 
Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)
Mikhail Kurnosov
 
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Mikhail Kurnosov
 
Лекция 1. Амортизационный анализ (amortized analysis)
Лекция 1. Амортизационный анализ (amortized analysis)Лекция 1. Амортизационный анализ (amortized analysis)
Лекция 1. Амортизационный анализ (amortized analysis)
Mikhail Kurnosov
 
Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)
Mikhail Kurnosov
 
Лекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмовЛекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмов
Mikhail Kurnosov
 
Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)
Mikhail Kurnosov
 
Лекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимостиЛекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимости
Mikhail Kurnosov
 
Семинар 10. Параллельное программирование на MPI (часть 3)
Семинар 10. Параллельное программирование на MPI (часть 3)Семинар 10. Параллельное программирование на MPI (часть 3)
Семинар 10. Параллельное программирование на MPI (часть 3)
Mikhail Kurnosov
 
Семинар 9. Параллельное программирование на MPI (часть 2)
Семинар 9. Параллельное программирование на MPI (часть 2)Семинар 9. Параллельное программирование на MPI (часть 2)
Семинар 9. Параллельное программирование на MPI (часть 2)
Mikhail Kurnosov
 
Лекция 9. Поиск кратчайшего пути в графе
Лекция 9. Поиск кратчайшего пути в графеЛекция 9. Поиск кратчайшего пути в графе
Лекция 9. Поиск кратчайшего пути в графе
Mikhail Kurnosov
 
Семинар 8. Параллельное программирование на MPI (часть 1)
Семинар 8. Параллельное программирование на MPI (часть 1)Семинар 8. Параллельное программирование на MPI (часть 1)
Семинар 8. Параллельное программирование на MPI (часть 1)
Mikhail Kurnosov
 
Лекция 8. Графы. Обходы графов
Лекция 8. Графы. Обходы графовЛекция 8. Графы. Обходы графов
Лекция 8. Графы. Обходы графов
Mikhail Kurnosov
 

Лекция 5: B-деревья (B-trees, k-way merge sort)

  • 1. Лекция 5: B-деревья (B-trees) Курносов Михаил Георгиевич к.т.н. доцент Кафедры вычислительных систем Сибирский государственный университет телекоммуникаций и информатики http://www.mkurnosov.net
  • 2. Организация дисковой памяти 2  Жёсткий диск (hard disk drive, HDD) – это совокупность пластин (platters), которые хранят данные в концентрических окружностях – дорожках (tracks)  Данные считываются/записываются головками (heads)  Пластины и головки приводятся в движение двигателями  Сектор (Sector) – часть дорожки (минимально адресуемая единица жесткого диска)  Кластер (Cluster) – это совокупность секторов дорожки  Цилиндр (Cylinder) – множество дорожек, размещенных на одном и том же месте нескольких пластин
  • 3. Организация дисковой памяти 3  Время доступа к сектору (seek time) зависит от скорости вращения пластин Количество вращений в минуту (Revolutions per minute, RPM) Время доступа (Rotational latency) 5400 rpm 0.011 сек. 7200 rpm 0.008 сек. 15 000 rpm 0.004 сек.  Время доступа к оперативной памяти (≈ 10 нс) в 105 раз меньше времени доступа к диску
  • 4. Твердотельные накопители (SSD) 4  Твердотельный накопитель (Solid state drive, flash drive, SSD) – это немеханическое запоминающее устройство на основе микросхем памяти  Время поиска блока на SSD (seek time) ≈ 0 сек
  • 5. Организация дисковой памяти 5  Для сокращения времени работы с диском данные читают и записывают блоками – буферизованный ввод/вывод  В алгоритмах для внешней памяти необходимо учитывать количество обращений к диску
  • 6. Структуры данных для внешней памяти 6  Имеется бинарное дерево поиска (binary search tree), в котором каждый узел содержит:  ключ (key) – строка из 32 символов (char[32], 32 байта)  значение (value) – целое число (int, 4 байта)  указатели left и right (по 8 байт)  Имеется сервер с 16 GiB оперативной памяти  Сколько узлов дерева поместится в оперативную память?
  • 7. Структуры данных для внешней памяти 7  Имеется бинарное дерево поиска (binary search tree), в котором каждый узел содержит:  ключ (key) – строка из 32 символов (char[32], 32 байта)  значение (value) – целое число (int, 4 байта)  указатели left и right (по 8 байт)  Имеется сервер с 16 GiB оперативной памяти  Сколько узлов дерева поместится в оперативную память?  Узел дерева занимает 32 + 4 + 8 + 8 = 52 байта  Пусть нам доступны все 16 GiB (оценка сверху): 16 * 2^30 / 52 ≈ 330 382 099 узлов
  • 8. Структуры данных для внешней памяти 8  Как хранить словарь из 1 000 000 000 записей?  Количество пользователей Facebook (июль 2013): 1 200 000 000  Количество пользователей Google Gmail (июнь 2012): 425 000 000  Количсество пользователей ВКонтакте (февраль 2013): 43 000 000  Решение: использовать внешнюю память – HDD/SSD-диски, сетевые хранилища
  • 9. B-дерево (B-tree) 9  B-дерево (B-tree) – это сбалансированное дерево поиска, узлы которого хранятся во внешней памяти (например, на диске HDD/SSD)  В любой момент времени в оперативной памяти находится лишь часть B-дерева (размер дерева может значительно превышать объем оперативной памяти)  B-деревья используются в файловых системах и системах управления базами данных (СУБД)  Авторы Rudolf Bayer и Edward M. McCreight Boeing Research Labs, USA, 1971  Буква “В” в названии B-деревьев: Boeing, Bayer, …  Bayer R., McCreight E. Organization and Maintenance of Large Ordered Indices // Math. and Information Sciences Report (Boeing Research Labs). – 1970, No. 20.  Bayer R. Binary B-Trees for Virtual Memory // Workshop on Data Description, Access and Control, 1971.
  • 10. B-дерево (B-tree) 10  Высота B-дерева не превышает O(logn), где n – количество узлов в дереве  Узлы B-дерева могут иметь много дочерних узлов – до тысяч (сильно ветвящиеся деревья)  Каждый узел B-дерева может содержать больше 1 ключа  Если внутренний узел содержит k ключей, то у него k + 1 дочерних узлов Один ключ Два ключаДва ключа
  • 11. B-дерево (B-tree) 11 key1, key2, …, key1000 key1, key2, …, key1000 key1, key2, …, key1000 key1, key2, …, key1000 1 2 … 1001 key1, key2, …, key1000 key1, key2, …, key1000 key1, key2, …, key1000 … … 1 2 … 1001 root 3 уровня 1 + 1001 + 1001 * 1001 = 1 003 003 узлов 1000 + 1001 * 1000 + 1001 * 1001 * 1000 = 1 003 003 000 ключей
  • 12. B-дерево (B-tree) 12  B-дерево (B-tree) – это корневое дерево, обладающее следующими свойствами: 1) Каждый узел содержит поля: − количество n ключей, хранящихся в узле − ключи key1, key2, …, keyn, упорядоченные по не убыванию key1 ≤ key2 ≤ … ≤ keyn − флаг leaf, равный true, если узел является листом − внутренний узел содержит n + 1 указателей c1, c2, …, cn+1 на дочерние узлы (листья не имеют дочерних узлов)
  • 13. B-дерево (B-tree) 13  B-дерево (B-tree) – это корневое дерево, обладающее следующими свойствами: 2) Ключи разделяют диапазоны ключей, хранящихся в поддеревьях: если ki – произвольный ключ в поддереве ci, то k1 ≤ key1 ≤ k2 ≤ key2 ≤ … ≤ keyn ≤ kn+1 3) Все листья расположены на одинаковой глубине, равной высоте h дерева
  • 14. B-дерево (B-tree) 14  B-дерево (B-tree) – это корневое дерево, обладающее следующими свойствами: 4) Имеются нижняя и верхняя границы количества ключей, хранящихся в узле – минимальная степень t (minimum degree) B-дерева − корневой узел содержит от 1 до 2t – 1 ключей − каждый внутренний узел содержит минимум t – 1 ключей и минимум t дочерних узлов − каждый узел содержит максимум 2t – 1 ключей и максимум 2t дочерних узлов (за исключением листьев) − узел заполнен (full), если он содержит 2t – 1 ключей
  • 15. … B-дерево (B-tree) 15 root …t – 1 t – 1 t – 1 … …t – 1 t – 1 t – 1 … t – 1 … …t – 1 t – 1 t – 1 … …t – 1 t – 1 t – 1 … t – 1 1Уровень: # узлов 0: 1 1: 2 2: 2t 3: 2t2
  • 16. 2-3-4-дерево (2-3-4 tree) 16 2-3-4-дерево (2-3-4 tree) t = 2, каждый узел может иметь 2, 3 или 4 дочерних узла
  • 17. Высота B-дерева 17  Утверждение. Высота B-дерева с n ≥ 1 ключами и минимальной степенью t ≥ 2 в худшем случае не превышает logt((n + 1) / 2)  Доказательство. Обозначим высоту B-дерева через h.  Рассмотрим максимально высокое B-дерево: в корне такого дерева хранится 1 ключ, а в остальных узлах по t – 1 ключу (минимально возможное количество)  На уровне 0 размещен один узел (корень) с 1 ключом  На уровне 1: 2 узла (у каждого по t – 1 ключу)  На уровне 2: 2t узлов  На уровне 3: 2t2 узлов  …  На уровне h: 2th-1 узлов
  • 18. Высота B-дерева 18  Утверждение. Высота B-дерева с n ≥ 1 ключами и минимальной степенью t ≥ 2 в худшем случае не превышает logt((n + 1) / 2)  Доказательство.  Тогда, общее количество ключей есть 𝑛 = 1 + 𝑡 − 1 2 + 2𝑡 + 2𝑡2 + 2𝑡3 + ⋯ + 2𝑡ℎ−1 = = 1 + 2 𝑡 − 1 1 + 𝑡 + 𝑡2 + ⋯ + 𝑡ℎ−1  Сумма h первых членов геометрической прогрессии 𝑆ℎ = 𝑏1(𝑞ℎ − 1) 𝑞 − 1
  • 19. Высота B-дерева 19  Утверждение. Высота B-дерева с n ≥ 1 ключами и минимальной степенью t ≥ 2 в худшем случае не превышает logt((n + 1) / 2)  Доказательство.  Следовательно, 𝑛 = 1 + 2 𝑡 − 1 𝑡ℎ − 1 𝑡 − 1 = 2𝑡ℎ − 1 𝑛 + 1 2 = 𝑡ℎ 𝒉 = 𝐥𝐨𝐠 𝒕 𝒏 + 𝟏 𝟐  Утверждение доказано.
  • 20. Операции с B-деревьями 20  Во всех операциях предполагаем следующее: o корень B-дерева всегда находится в оперативной памяти o для чтения и записи данных на диск используются процедуры DiskRead и DiskWrite  Б-дерево минимизирует количество обращений к внешней памяти (к DiskRead, DiskWrite)
  • 21. Поиск элемента (Lookup) 21 1) Поиск начинаем с корня дерева. Для заданного ключа k среди ключей текущего узла key1 ≤ key2 ≤ … ≤ keyn отыскиваем первый ключ keyi, такой что k ≤ keyi 2) Если k = keyi, то прекращаем поиск (узел найден) 3) Иначе, загружаем с диска (DiskRead) дочерний узел ci и рекурсивного обследуем его ключи 4) Если достигли листа (leaf = true), завершаем работу (ключ не найден)
  • 22. Поиск элемента (Lookup) 22 function BTreeLookup(node, key) i = 1 while i < n AND key > node.key[i] do i = i + 1 end while if i <= n AND key = node.key[i] then return (node, i) if node.leaf != TRUE then child = DiskRead(node.c[i]) return BTreeLookup(child, key) end if return NULL end function
  • 23. Поиск элемента (Lookup) 23 function BTreeLookup(node, key) i = 1 while i < n AND key > node.key[i] do i = i + 1 end while if i <= n AND key = node.key[i] then return (node, i) if node.leaf != TRUE then child = DiskRead(node.c[i]) return BTreeLookup(child, key) end if return NULL end function O(t)  Количество чтений с диска: 𝑇𝑅𝑒𝑎𝑑 = 𝑂 ℎ = 𝑂(log 𝑡 𝑛)  Вычислительная сложность: 𝑇 = 𝑂 𝑡ℎ = 𝑂(𝑡 log 𝑡 𝑛)
  • 24. Поиск элемента (Lookup) 24 function BTreeLookup(node, key) i = 1 while i < n AND key > node.key[i] do i = i + 1 end while if i <= n AND key = node.key[i] then return (node, i) if node.leaf != TRUE then child = DiskRead(node.c[i]) return BTreeLookup(child, key) end if return NULL end function O(t)  Количество чтений с диска: 𝑇𝑅𝑒𝑎𝑑 = 𝑂 ℎ = 𝑂(log 𝑡 𝑛)  Вычислительная сложность: 𝑇 = 𝑂 𝑡ℎ = 𝑂(𝑡 log 𝑡 𝑛) Как ускорить поиск ключа в узле?
  • 25. Поиск элемента (Lookup) 25 function BTreeLookup(node, key) i = 1 while i < n AND key > node.key[i] do i = i + 1 end while if i <= n AND key = node.key[i] then return (node, i) if node.leaf != TRUE then child = DiskRead(node.c[i]) return BTreeLookup(child, key) end if return NULL end function O(t)  Количество чтений с диска: 𝑇𝑅𝑒𝑎𝑑 = 𝑂 ℎ = 𝑂(log 𝑡 𝑛)  Вычислительная сложность: 𝑇 = 𝑂 𝑡ℎ = 𝑂(𝑡 log 𝑡 𝑛) Как ускорить поиск ключа в узле? Двоичный поиск (Binary search) за время O(log2t) T = O(log2t ∙ logtn)
  • 26. Создание пустого B-дерева (Create) 26 function BTreeCreate() node = DiskAllocateNode() node.leaf = TRUE node.n = 0 DiskWrite(node) end function  Количество дисковых операций: 𝑇 𝐷𝑖𝑠𝑘 = 𝑂 1  Вычислительная сложность: 𝑇 = 𝑂 1 1) Выделить на диске место для корневого узла 2) Заполнить поля корневого узла
  • 27. Добавление ключа (Insert) 27 1) Для заданного ключа key находим лист для вставки нового элемента 2) Если лист не заполнен (ключей меньше или равно 2t – 1), то вставляем ключ в узел (сохраняя упорядоченность ключей) 2 4 31 5 B-дерево Вставка ключа 6
  • 28. Добавление ключа (Insert) 28 3) Если лист заполнен (содержит 2t – 1 ключей), то разбиваем его (split) на 2 листа по t – 1 ключей – среди ключей листа key1 ≤ key2 ≤ … ≤ keyn и ключа key отыскиваем медиану (median key) – средний ключ разделитель 4) Ключ медиана вставляется в родительский узел. Если родительский узел заполнен, то он разбивается и процедура повторяется по описанной выше схеме. Подъем вверх по дереву может продолжаться до корня
  • 29. Добавление ключа (Insert) в 2-3 B-дерево 29 4 5 7 62 1 3 5 6 2 4 1 3 5 2 4 1 3 2 1 3 4 2 1 3 1 2 1 Ключ 1 Ключ 2 Ключ 3 разбиение 1, 2, 3 Ключ 4 Ключ 5 разбиение 3, 4, 5 Ключ 6 Ключ 7 разбиение 5, 6, 7; разбиение 2, 4, 6
  • 30. Добавление ключа (Insert) 30  При проходе от корня дерева к искомому листу разбиваем (split) все заполненные узлы, через которые проходим (включая лист).  Это гарантирует, что если понадобится разбить узел, то его родительский узел не будет заполнен
  • 31. Разбиение узла (Split) 31 function BTreeSplitNode(node, parent, i) z = DiskAllocateNode() z.leaf = node.leaf z.n = t – 1 /* Половина ключей перемещаются в новый узел */ for j = 1 to t – 1 do z.key[j] = node.key[t + j] end for if node.leaf = FALSE then for j = 1 to t do z.c[j] = node.c[t + j] end for end if
  • 32. Разбиение узла (Split) /* В node остается меньшая половина ключей */ node.n = t – 1 /* Вставляем ключ в родительский узел */ for j = parent.n + 1 downto i + 1 do parent.c[j + 1] = parent.c[j] end for parent.c[i + 1] = z for j = parent.n downto i do parent.key[j + 1] = parent.key[j] end for parent.key[i] = node.key[t] parent.n = parent.n + 1 DiskWrite(node) DiskWrite(z) DiskWrite(parent) end function 32 TSplitNode = O(t) TDisk = O(1)
  • 33. Добавление ключа (Insert) 33 function BTreeInsert(root, key) if root.n = 2t – 1 then newroot = DiskAllocateNode() newroot.leaf = FALSE newroot.n = 0 newroot.c[1] = root BTreeSplitNode(root, newroot, 1) return BTreeInsertNonfull(newroot, key) end if return BTreeInsertNonfull(root, key) end function
  • 34. Добавление ключа (Insert) function BTreeInsertNonfull(node, key) i = node.n if node.leaf = TRUE then while i > 1 AND key < node.key[i] do node.key[i + 1] = node.key[i] i = i - 1 end while node.key[i + 1] = key node.n = node.n + 1 DiskWrite(node) else while i > 1 AND key < node.key[i] do i = i - 1 end while i = i + 1 DiskRead(node.c[i]) 34
  • 35. Добавление ключа (Insert) 35 if node.c[i].n = 2t – 1 then BTreeSplitNode(node.c[i], node, i) if key > node.key[i] then i = i + 1 end if end if node = BTreeInsertNonfull(node.c[i], key) end if return node end function  Вычислительная сложность вставки ключа в B-дерево в худшем случае (разбиваем узлы на каждом уровне): 𝑇 = 𝑂 𝑡ℎ = 𝑂(𝑡 log 𝑡 𝑛)  Количество дисковых операций: 𝑇 𝐷𝑖𝑠𝑘 = 𝑂 ℎ = 𝑂(log 𝑡 𝑛)
  • 36. Удаление ключа (Delete) 36  Находим узел, содержащий искомый ключ key  Если ключ key находится в листе, то удаляем ключ из него  Если количество ключей стало меньше t – 1, выполняем восстановление свойств B-дерева  … Изучить самостоятельно [CLRS, С. 530]
  • 37. Виды B-деревьев 37  B+-дерево (B+-tree) – это B-дерево, в котором только листья содержат информацию, а внутренние узлы хранят только ключи  Примнение: храннеие  B*-дерево (B*-tree) – это B-дерево, в котором каждый узел (за исключением корня) должен содержать не менее 2/3 ключей, а не 1/2 как в B-дереве
  • 38. Применение B-деревьев 38  B+-деревья: o индексация метаданных в файловых системах NTFS, ReiserFS, NSS, XFS, JFS o индексы таблиц в СУБД IBM DB2, Informix, Microsoft SQL Server, Oracle 8, Sybase ASE, SQLite
  • 39. Реализация 2-3-4 B-tree 39 /* Minimum degree of B-tree */ #define T 2 /* 2-3-4 B-tree */ struct btree { int leaf; int nkeys; int *key; int *value; struct btree **child; };
  • 40. Реализация B-tree 40 struct btree *btree_create() { struct btree *node; node = malloc(sizeof(*node)); node->leaf = 1; node->nkeys = 0; node->key = malloc(sizeof(*node->key) * 2 * T - 1); node->value = malloc(sizeof(*node->value) * 2 * T - 1); node->child = malloc(sizeof(*node->child) * 2 * T); return node; }
  • 41. Реализация B-tree void btree_lookup(struct btree *tree, int key, struct btree **node, int *index) { int i; for (i = 0; i < tree->nkeys && key > tree->key[i]; ) { i++; } if (i < tree->nkeys && key == tree->key[i]) { *node = tree; *index = i; return; } if (!tree->leaf) { /* Disk read tree->child[i] */ btree_lookup(tree, key, node, index); } else { *node = NULL; } } 41
  • 42. Реализация B-tree struct btree *btree_insert(struct btree *tree, int key, int value) { struct btree *newroot; if (tree == NULL) { tree = btree_create(); tree->nkeys = 1; tree->key[0] = key; tree->value[0] = value; return tree; } if (tree->nkeys == 2 * T - 1) { newroot = btree_create(); /* Create empty root */ newroot->leaf = 0; newroot->child[0] = tree; btree_split_node(tree, newroot, 0); return btree_insert_nonfull(newroot, key, value); } return btree_insert_nonfull(tree, key, value); } 42
  • 43. Реализация B-tree void btree_split_node(struct btree *node, struct btree *parent, int index) { struct btree *z; int i; z = btree_create(); z->leaf = node->leaf; z->nkeys = T - 1; for (i = 0; i < T - 1; i++) { z->key[i] = node->key[T + i]; z->value[i] = node->value[T + i]; } if (!node->leaf) { for (i = 0; i < T; i++) z->child[i] = node->child[i + T]; } node->nkeys = T - 1; 43
  • 44. Реализация B-tree /* Insert median key into parent node */ for (i = parent->nkeys; i >= 0 && i <= index + 1; i--) parent->child[i + 1] = parent->child[i]; parent->child[index + 1] = z; for (i = parent->nkeys - 1; i >= 0 && i <= index; i--) { parent->key[i + 1] = parent->key[i]; parent->value[i + 1] = parent->value[i]; } parent->key[index] = node->key[T - 1]; parent->value[index] = node->value[T - 1]; parent->nkeys++; /* Write to disk: node, z, parent */ } 44
  • 45. Реализация B-tree struct btree *btree_insert_nonfull( struct btree *node, int key, int value) { int i; i = node->nkeys; if (node->leaf) { for (i = node->nkeys - 1; i > 0 && key < node->key[i]; i--) { node->key[i + 1] = node->key[i]; } node->key[i + 1] = key; node->nkeys++; } else { 45
  • 46. Реализация B-tree for (i = node->nkeys - 1; i > 0 && key < node->key[i]; ) { i--; } i++; if (node->child[i]->nkeys == 2 * T - 1) { btree_split_node(node->child[i], node, i); if (key > node->key[i]) i++; } node = btree_insert_nonfull(node->child[i], key, value); } return node; } 46
  • 47. Реализация B-tree int main() { struct btree *tree; tree = btree_insert(NULL, 3, 0); tree = btree_insert(tree, 12, 0); tree = btree_insert(tree, 9, 0); tree = btree_insert(tree, 18, 0); return 0; } 47
  • 48. Внешняя сортировка слиянием 48  Внешняя сортировка (External sorting) – это класс алгоритмов сортировки, которые оперируют данными размещенными на внешней памяти  Как отсортировать 300 GiB данных на жестком диске имея 2 GiB оперативной памяти?
  • 49. Внешняя сортировка слиянием 49  Внешняя сортировка (External sorting) – это класс алгоритмов сортировки, которые оперируют данными размещенными на внешней памяти  Как отсортировать 300 GiB данных на жестком диске имея 2 GiB оперативной памяти? 1. Загружаем блок размером 2 GiB в оперативную память 2. Сортируем блок (MergeSort, QuickSort, CountingSort, …) и сохраняем на нешнюю память (диск) 3. Повторяем шаги 1 и 2, пока на получим 300 / 2 = 150 отсортированных блоков на внешней памяти 4. Создаем в оперативной памяти 151 буфер по 13 KiB (2 GiB / 151 ≈ 13 KiB) 5. Загружаем в 150 буферов по 13 KiB из отсортированных блоков, 151-й буфер – это выходной блок 6. В выходной блок сливаем (merge) данные из 150 буферов и записываем его на внешнюю память 7. Повторяем шаги 5 и 6 пока не сольем все 150 блоков
  • 50. Внешняя сортировка слиянием 50  Внешняя сортировка (External sorting) – это класс алгоритмов сортировки, которые оперируют данными размещенными на внешней памяти  Как отсортировать 300 GiB данных на жестком диске имея 2 GiB оперативной памяти? 1. Загружаем блок размером 2 GiB в оперативную память 2. Сортируем блок (MergeSort, QuickSort, CountingSort, …) и сохраняем на нешнюю память (диск) 3. Повторяем шаги 1 и 2, пока на получим 300 / 2 = 150 отсортированных блоков на внешней памяти 4. Создаем в оперативной памяти 151 буфер по 13 KiB (2 GiB / 151 ≈ 13 KiB) 5. Загружаем в 150 буферов по 13 KiB из отсортированных блоков, 151-й буфер – это выходной блок 6. В выходной блок сливаем (merge) данные из 150 буферов и записываем его на внешнюю память 7. Повторяем шаги 5 и 6 пока не сольем все 150 блоков k-way merge sort k = 300 GiB / 2 GiB = 150 150-way merge sort
  • 51. Задания 51  Рассмотреть применение B-деревьев в файловых системах – что содержит поле “ключ” (key) и поле “значение” (value)  Привести пример значения t, используемого в файловой системе Btrfs  Изучить применение B-деревьев в системах управления базами данных (MySQL, PostgreSQL, Microsoft SQL Server, IBM DB2 и др.): какие задачи они решают, что хранится в поле “ключ” (key) и поле “значение” (value)