SlideShare a Scribd company logo
1 of 50
Download to read offline
Лекция 5B-деревья(B-trees) 
КурносовМихаил Георгиевич 
E-mail: mkurnosov@gmail.com 
WWW: www.mkurnosov.net 
Курс “Алгоритмы и структуры данных” 
Сибирский государственный университет телекоммуникаций и информатики (Новосибирск) 
Осенний семестр, 2014
Организация дисковой памяти 
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. McCreightBoeing Research Labs, USA, 1971 
Буква “В”в названии B-деревьев: Boeing, Bayer, … 
Bayer R., McCreightE. 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+푡−12+2푡+2푡2+2푡3+⋯+2푡ℎ−1= 
=1+2푡−11+푡+푡2+⋯+푡ℎ−1 
Сумма hпервых членов геометрической прогрессии 푆ℎ= 푏1(푞ℎ−1) 푞−1
Высота B-дерева 
19 
Утверждение.Высота B-дерева с n≥ 1 ключамии минимальной степенью t ≥ 2 в худшем случае не превышает logt((n+ 1) / 2) 
Доказательство (продолжение) 
Следовательно, 
푛=1+2푡−1 푡ℎ−1 푡−1=2푡ℎ−1 푛+12=푡ℎ 
풉=퐥퐨퐠풕 풏+ퟏ ퟐ 
Утверждение доказано.
Операции с B-деревьями 
20 
Во всех операциях предполагаем следующее: 
oКорень B-дерева всегда находится в оперативной памяти 
oДля чтения и записи данных на диск используются процедуры DiskReadи DiskWrite 
B-дерево минимизирует количество обращений к внешней памяти –минимум операций DiskRead, DiskWrite
Поиск элемента (Lookup) 
21 
1)Поиск начинаем с корня дерева. Для заданного ключа kсреди ключей текущего узла 
key1<key2<…< keyn 
отыскиваем первый ключ keyi, такой что k≤keyi 
2)Если k= keyi, то прекращаем поиск(узел найден) 
3)Иначе, загружаем с диска(DiskRead)дочерний узел ciи рекурсивного обследуем его ключи 
4)Если достигли листа (поле leaf= true), завершаем работу – ключ не найден
Поиск элемента (Lookup) 
22 
functionBTreeLookup(node, key) 
i = 1 
whilei < node.nANDkey > node.key[i] do 
i = i + 1 
end while 
ifi <= node.nANDkey = node.key[i] then 
return(node, i) 
ifnode.leaf!= TRUE then 
child = DiskRead(node.c[i]) 
returnBTreeLookup(child, key) 
end if 
returnNULL 
end function
Поиск элемента (Lookup) 
23 
functionBTreeLookup(node, key) 
i = 1 
whilei < node.nANDkey > node.key[i] do 
i = i + 1 
end while 
ifi <= node.nANDkey = node.key[i] then 
return(node, i) 
ifnode.leaf!= TRUE then 
child = DiskRead(node.c[i]) 
returnBTreeLookup(child, key) 
end if 
returnNULL 
end function 
O(t) 
Количество чтений с диска: 푇푅푒푎푑=푂ℎ=푂(log푡푛) 
Вычислительная сложность: 푇=푂푡ℎ=푂(푡log푡푛)
Поиск элемента (Lookup) 
24 
functionBTreeLookup(node, key) 
i = 1 
whilei < node.nANDkey > node.key[i] do 
i = i + 1 
end while 
ifi <= n ANDkey = node.key[i] then 
return(node, i) 
ifnode.leaf!= TRUE then 
child = DiskRead(node.c[i]) 
returnBTreeLookup(child, key) 
end if 
returnNULL 
end function 
Количество чтений с диска: 푇푅푒푎푑=푂ℎ=푂(log푡푛) 
Вычислительная сложность: 푇=푂푡ℎ=푂(푡log푡푛) 
Как ускорить поиск ключа в узле? 
O(t)
Поиск элемента (Lookup) 
25 
functionBTreeLookup(node, key) 
i = 1 
whilei < node.nANDkey > node.key[i] do 
i = i + 1 
end while 
ifi <= n ANDkey = node.key[i] then 
return(node, i) 
ifnode.leaf!= TRUE then 
child = DiskRead(node.c[i]) 
returnBTreeLookup(child, key) 
end if 
returnNULL 
end function 
Количество чтений с диска: 푇푅푒푎푑=푂ℎ=푂(log푡푛) 
Вычислительная сложность: 푇=푂푡ℎ=푂(푡log푡푛) 
Как ускорить поиск ключа в узле? 
Двоичный поиск (Binarysearch) за время O(log2t) 
T= O(log2t∙ logtn) 
O(t)
Создание пустого B-дерева (Create) 
26 
functionBTreeCreate() 
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 
3 
1 
5 
B-дерево 
Вставка ключа 6
Добавление ключа (Insert) 
28 
3)Если лист заполнен (содержит 2t–1ключей), то разбиваем его(split)на 2 листа по t–1 ключей – среди ключей листа key1<key2<…<keynи ключа keyотыскиваем медиану (mediankey) –средний ключ разделитель 
4)Ключ медиана вставляется в родительский узел. Если родительский узел заполнен, то он разбивается и процедура повторяется по описанной выше схеме. Подъем вверх по дереву может продолжаться до корня
Добавление ключа (Insert)в 2-3 B-дерево 
29 
4 
5 
7 
6 
2 
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 
functionBTreeSplitNode(node, parent, i) 
z = DiskAllocateNode() 
z.leaf= node.leaf 
z.n= t –1 
/* Половина ключей перемещаются в новый узел*/ 
forj = 1 tot –1 do 
z.key[j] = node.key[t + j] 
end for 
ifnode.leaf= FALSE then 
forj = 1 tot do 
z.c[j] = node.c[t + j] 
end for 
end if
Разбиение узла (Split) 
/* В node остается меньшая половина ключей*/ 
node.n= t –1 
/* Вставляем ключ в родительский узел */ 
forj = parent.n+ 1 downtoi + 1 do 
parent.c[j + 1] = parent.c[j] 
end for 
parent.c[i + 1] = z 
forj = parent.ndowntoi 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 
functionBTreeInsert(root, key) 
ifroot.n= 2t –1 then 
newroot= DiskAllocateNode() 
newroot.leaf= FALSE 
newroot.n= 0 
newroot.c[1] = root 
BTreeSplitNode(root, newroot, 1) 
returnBTreeInsertNonfull(newroot, key) 
end if 
returnBTreeInsertNonfull(root, key) 
end function
Добавление ключа (Insert) 
functionBTreeInsertNonfull(node, key) 
i = node.n 
ifnode.leaf= TRUE then 
whilei > 1 ANDkey < 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 
whilei > 1 ANDkey < node.key[i] do 
i = i -1 
end while 
i = i + 1 
DiskRead(node.c[i]) 
34
Добавление ключа (Insert) 
35 
ifnode.c[i].n = 2t –1 then 
BTreeSplitNode(node.c[i], node, i) 
ifkey > node.key[i] then 
i = i + 1 
end if 
end if 
node = BTreeInsertNonfull(node.c[i], key) 
end if 
returnnode 
end function 
Вычислительная сложность вставки ключа в B-деревов худшем случае (разбиваем узлы на каждом уровне): 푇=푂푡ℎ=푂(푡log푡푛) 
Количество дисковых операций: 푇퐷푖푠푘=푂ℎ=푂(log푡푛)
Удаление ключа (Delete) 
36 
Находим узел, содержащий искомый ключ key 
Если ключ keyнаходится в листе, то удаляем ключ из него 
Если количество ключей стало меньше t –1, выполняем восстановление свойств B-дерева 
… 
Изучить самостоятельно [CLRS3ed, С. 536]
Виды B-деревьев 
37 
B+-дерево (B+-tree)–это B-дерево, в котором только листья содержат информацию, а внутренние узлы хранят только ключи 
индексация метаданных в файловых системах Btrfs, NTFS, ReiserFS, NSS, XFS, JFS 
индексы таблиц в СУБД IBM DB2, Informix, Microsoft SQL Server, Oracle 8, Sybase ASE, SQLite 
B*-дерево (B*-tree)–это B-дерево, в котором каждый узел (за исключением корня) должен содержать не менее 2/3 ключей(а не 1/2 как в B-дереве)
Реализация 2-3-4 B-tree 
38 
/* Minimum degree of B-tree */ 
#define T 2 /* 2-3-4 B-tree */ 
structbtree{ 
intleaf; 
intnkeys; 
int*key; 
int*value; 
structbtree**child; 
};
Реализация B-tree 
39 
structbtree*btree_create() 
{ 
structbtree*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); 
returnnode; 
}
Реализация B-tree 
voidbtree_lookup(structbtree*tree, intkey, 
structbtree**node, int*index) 
{ 
inti; 
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; 
} 
} 40
Реализация B-tree 
structbtree*btree_insert(structbtree*tree, 
intkey, intvalue) 
{ 
structbtree*newroot; 
if(tree == NULL) { 
tree = btree_create(); 
tree->nkeys= 1; 
tree->key[0] = key; 
tree->value[0] = value; 
returntree; 
} 
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); 
returnbtree_insert_nonfull(newroot, key, value); 
} 
returnbtree_insert_nonfull(tree, key, value); 
} 41
Реализация B-tree 
voidbtree_split_node(structbtree*node, 
structbtree*parent, intindex) 
{ 
structbtree*z; 
inti; 
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; 
42
Реализация 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 */ 
} 
43
Реализация B-tree 
structbtree*btree_insert_nonfull( 
structbtree*node, intkey, intvalue) 
{ 
inti; 
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{ 
44
Реализация 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); 
} 
returnnode; 
} 
45
Реализация B-tree 
intmain() 
{ 
structbtree*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); 
return0; 
} 
46
Внешняя сортировка слиянием 
47 
Внешняя сортировка (External sorting)–это класс алгоритмов сортировки, которые оперируют данными размещенными на внешней памяти 
Как отсортировать 300 GiBданных на жестком диске имея 2GiBоперативной памяти?
Внешняя сортировка слиянием 
48 
Внешняя сортировка (External sorting)–это класс алгоритмов сортировки, которые оперируют данными размещенными на внешней памяти 
Как отсортировать 300 GiBданных на жестком диске имея 2GiBоперативной памяти? 
1.Загружаем блок размером 2 GiBв оперативную память 
2.Сортируем блок (MergeSort, QuickSort, CountingSort, …)и сохраняем на внешнюю память (диск) 
3.Повторяем шаги 1 и 2, пока на получим 300 / 2 = 150 отсортированных блоков на внешней памяти 
4.Создаем в оперативной памяти 151 буфер по 13 KiB(2GiB/ 151 ≈ 13 KiB) 
5.Загружаем в 150 буферов по 13 KiBиз отсортированных блоков,151-йбуфер –это выходной блок 
6.В выходной блок сливаем (merge) данные из 150 буферов и записываем его на внешнюю память 
7.Повторяем шаги 5 и 6 пока не сольем все 150 блоков
Внешняя сортировка слиянием 
49 
Внешняя сортировка (External sorting)–это класс алгоритмов сортировки, которые оперируют данными размещенными на внешней памяти 
Как отсортировать 300 GiBданных на жестком диске имея 2GiBоперативной памяти? 
1.Загружаем блок размером 2 GiBв оперативную память 
2.Сортируем блок (MergeSort, QuickSort, CountingSort, …)и сохраняем на внешнюю память (диск) 
3.Повторяем шаги 1 и 2, пока на получим 300 / 2 = 150 отсортированных блоков на внешней памяти 
4.Создаем в оперативной памяти 151 буфер по 13 KiB(2GiB/ 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
Задания 
50 
Рассмотреть применение B-деревьев в файловых системах – что содержит поле “ключ” (key)и поле “значение”(value) 
Привести пример значения t, используемого в файловой системеBtrfs 
Изучить применение B-деревьев в системах управления базами данных(MySQL, PostgreSQL, Microsoft SQL Server, IBM DB2 и др.): какие задачи они решают, что хранится в поле “ключ” (key) и поле “значение”(value)

More Related Content

What's hot

Лекция 9: Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 9: Декартовы деревья (Treaps, дучи, дерамиды)Лекция 9: Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 9: Декартовы деревья (Treaps, дучи, дерамиды)
Mikhail Kurnosov
 
Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)
Mikhail Kurnosov
 
Лекция 6: Биномиальные кучи (Binomial heaps)
Лекция 6: Биномиальные кучи (Binomial heaps)Лекция 6: Биномиальные кучи (Binomial heaps)
Лекция 6: Биномиальные кучи (Binomial heaps)
Mikhail Kurnosov
 
Лекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные спискиЛекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные списки
Mikhail Kurnosov
 
Лекция 2: АВЛ-деревья (AVL trees)
Лекция 2: АВЛ-деревья (AVL trees)Лекция 2: АВЛ-деревья (AVL trees)
Лекция 2: АВЛ-деревья (AVL trees)
Mikhail Kurnosov
 
Лекция 5: Бинарные деревья поиска
Лекция 5: Бинарные деревья поискаЛекция 5: Бинарные деревья поиска
Лекция 5: Бинарные деревья поиска
Mikhail Kurnosov
 
Лекция №11. Работа с внешней памятью (файлами). Предмет "Структуры и алгоритм...
Лекция №11. Работа с внешней памятью (файлами). Предмет "Структуры и алгоритм...Лекция №11. Работа с внешней памятью (файлами). Предмет "Структуры и алгоритм...
Лекция №11. Работа с внешней памятью (файлами). Предмет "Структуры и алгоритм...
Nikolay Grebenshikov
 
Алгоритмы и структуры данных осень 2013 лекция 6
Алгоритмы и структуры данных осень 2013 лекция 6Алгоритмы и структуры данных осень 2013 лекция 6
Алгоритмы и структуры данных осень 2013 лекция 6
Technopark
 
Алгоритмы и структуры данных осень 2013 лекция 5
Алгоритмы и структуры данных осень 2013 лекция 5Алгоритмы и структуры данных осень 2013 лекция 5
Алгоритмы и структуры данных осень 2013 лекция 5
Technopark
 
Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки да...
Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки да...Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки да...
Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки да...
Nikolay Grebenshikov
 

What's hot (20)

Лекция 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)
 
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
 
Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)
 
Лекция 9: Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 9: Декартовы деревья (Treaps, дучи, дерамиды)Лекция 9: Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 9: Декартовы деревья (Treaps, дучи, дерамиды)
 
Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)
 
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
 
Лекция 6: Биномиальные кучи (Binomial heaps)
Лекция 6: Биномиальные кучи (Binomial heaps)Лекция 6: Биномиальные кучи (Binomial heaps)
Лекция 6: Биномиальные кучи (Binomial heaps)
 
Лекция 5. Бинарные деревья поиска
Лекция 5. Бинарные деревья поискаЛекция 5. Бинарные деревья поиска
Лекция 5. Бинарные деревья поиска
 
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
 
Лекция 11. Деревья отрезков (Interval trees)
Лекция 11. Деревья отрезков (Interval trees)Лекция 11. Деревья отрезков (Interval trees)
Лекция 11. Деревья отрезков (Interval trees)
 
Лекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные спискиЛекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные списки
 
Лекция 2: АВЛ-деревья (AVL trees)
Лекция 2: АВЛ-деревья (AVL trees)Лекция 2: АВЛ-деревья (AVL trees)
Лекция 2: АВЛ-деревья (AVL trees)
 
Лекция 5: Бинарные деревья поиска
Лекция 5: Бинарные деревья поискаЛекция 5: Бинарные деревья поиска
Лекция 5: Бинарные деревья поиска
 
Лекция №11. Работа с внешней памятью (файлами). Предмет "Структуры и алгоритм...
Лекция №11. Работа с внешней памятью (файлами). Предмет "Структуры и алгоритм...Лекция №11. Работа с внешней памятью (файлами). Предмет "Структуры и алгоритм...
Лекция №11. Работа с внешней памятью (файлами). Предмет "Структуры и алгоритм...
 
Dictionary в Python. По мотивам Objects/dictnotes.txt
Dictionary в Python. По мотивам Objects/dictnotes.txtDictionary в Python. По мотивам Objects/dictnotes.txt
Dictionary в Python. По мотивам Objects/dictnotes.txt
 
03 двоичные деревья поиска и очередь с приоритетами
03 двоичные деревья поиска и очередь с приоритетами03 двоичные деревья поиска и очередь с приоритетами
03 двоичные деревья поиска и очередь с приоритетами
 
Алгоритмы и структуры данных осень 2013 лекция 6
Алгоритмы и структуры данных осень 2013 лекция 6Алгоритмы и структуры данных осень 2013 лекция 6
Алгоритмы и структуры данных осень 2013 лекция 6
 
Алгоритмы и структуры данных осень 2013 лекция 5
Алгоритмы и структуры данных осень 2013 лекция 5Алгоритмы и структуры данных осень 2013 лекция 5
Алгоритмы и структуры данных осень 2013 лекция 5
 
Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки да...
Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки да...Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки да...
Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки да...
 

Viewers also liked

как построить дерево вариантов
как построить дерево вариантовкак построить дерево вариантов
как построить дерево вариантов
Rumyanceva
 
Лекция 10: Графы. Остовные деревья минимальной стоимости
Лекция 10: Графы. Остовные деревья минимальной стоимостиЛекция 10: Графы. Остовные деревья минимальной стоимости
Лекция 10: Графы. Остовные деревья минимальной стоимости
Mikhail Kurnosov
 
Лекция 12: Трудноразрешимые задачи
Лекция 12: Трудноразрешимые задачиЛекция 12: Трудноразрешимые задачи
Лекция 12: Трудноразрешимые задачи
Mikhail Kurnosov
 
Лекция 11: Методы разработки алгоритмов
Лекция 11: Методы разработки алгоритмовЛекция 11: Методы разработки алгоритмов
Лекция 11: Методы разработки алгоритмов
Mikhail Kurnosov
 

Viewers also liked (17)

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

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

1508 10035
1508 100351508 10035
1508 10035
 
1508 10035
1508 100351508 10035
1508 10035
 
деревья
деревьядеревья
деревья
 
компьютерра
компьютерракомпьютерра
компьютерра
 
компьютерра
компьютерракомпьютерра
компьютерра
 
D-кучи и их применение
D-кучи и их применениеD-кучи и их применение
D-кучи и их применение
 
структура данных на магнитных дисках
структура данных на магнитных дискахструктура данных на магнитных дисках
структура данных на магнитных дисках
 
Архитектура и программирование потоковых многоядерных процессоров для научных...
Архитектура и программирование потоковых многоядерных процессоров для научных...Архитектура и программирование потоковых многоядерных процессоров для научных...
Архитектура и программирование потоковых многоядерных процессоров для научных...
 

More from Mikhail Kurnosov

More from Mikhail Kurnosov (16)

Векторизация кода (семинар 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...
 
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
 
Лекция 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...
 
Лекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмовЛекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмов
 
Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)
 
Семинар 9. Параллельное программирование на MPI (часть 2)
Семинар 9. Параллельное программирование на MPI (часть 2)Семинар 9. Параллельное программирование на MPI (часть 2)
Семинар 9. Параллельное программирование на MPI (часть 2)
 
Семинар 8. Параллельное программирование на MPI (часть 1)
Семинар 8. Параллельное программирование на MPI (часть 1)Семинар 8. Параллельное программирование на MPI (часть 1)
Семинар 8. Параллельное программирование на MPI (часть 1)
 
Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Семинар 7. Многопоточное программирование на OpenMP (часть 7)Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Семинар 7. Многопоточное программирование на OpenMP (часть 7)
 
Семинар 6. Многопоточное программирование на OpenMP (часть 6)
Семинар 6. Многопоточное программирование на OpenMP (часть 6)Семинар 6. Многопоточное программирование на OpenMP (часть 6)
Семинар 6. Многопоточное программирование на OpenMP (часть 6)
 
Семинар 5. Многопоточное программирование на OpenMP (часть 5)
Семинар 5. Многопоточное программирование на OpenMP (часть 5)Семинар 5. Многопоточное программирование на OpenMP (часть 5)
Семинар 5. Многопоточное программирование на OpenMP (часть 5)
 

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

  • 1. Лекция 5B-деревья(B-trees) КурносовМихаил Георгиевич E-mail: mkurnosov@gmail.com WWW: www.mkurnosov.net Курс “Алгоритмы и структуры данных” Сибирский государственный университет телекоммуникаций и информатики (Новосибирск) Осенний семестр, 2014
  • 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. McCreightBoeing Research Labs, USA, 1971 Буква “В”в названии B-деревьев: Boeing, Bayer, … Bayer R., McCreightE. 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+푡−12+2푡+2푡2+2푡3+⋯+2푡ℎ−1= =1+2푡−11+푡+푡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 푛+12=푡ℎ 풉=퐥퐨퐠풕 풏+ퟏ ퟐ Утверждение доказано.
  • 20. Операции с B-деревьями 20 Во всех операциях предполагаем следующее: oКорень B-дерева всегда находится в оперативной памяти oДля чтения и записи данных на диск используются процедуры DiskReadи DiskWrite B-дерево минимизирует количество обращений к внешней памяти –минимум операций 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 functionBTreeLookup(node, key) i = 1 whilei < node.nANDkey > node.key[i] do i = i + 1 end while ifi <= node.nANDkey = node.key[i] then return(node, i) ifnode.leaf!= TRUE then child = DiskRead(node.c[i]) returnBTreeLookup(child, key) end if returnNULL end function
  • 23. Поиск элемента (Lookup) 23 functionBTreeLookup(node, key) i = 1 whilei < node.nANDkey > node.key[i] do i = i + 1 end while ifi <= node.nANDkey = node.key[i] then return(node, i) ifnode.leaf!= TRUE then child = DiskRead(node.c[i]) returnBTreeLookup(child, key) end if returnNULL end function O(t) Количество чтений с диска: 푇푅푒푎푑=푂ℎ=푂(log푡푛) Вычислительная сложность: 푇=푂푡ℎ=푂(푡log푡푛)
  • 24. Поиск элемента (Lookup) 24 functionBTreeLookup(node, key) i = 1 whilei < node.nANDkey > node.key[i] do i = i + 1 end while ifi <= n ANDkey = node.key[i] then return(node, i) ifnode.leaf!= TRUE then child = DiskRead(node.c[i]) returnBTreeLookup(child, key) end if returnNULL end function Количество чтений с диска: 푇푅푒푎푑=푂ℎ=푂(log푡푛) Вычислительная сложность: 푇=푂푡ℎ=푂(푡log푡푛) Как ускорить поиск ключа в узле? O(t)
  • 25. Поиск элемента (Lookup) 25 functionBTreeLookup(node, key) i = 1 whilei < node.nANDkey > node.key[i] do i = i + 1 end while ifi <= n ANDkey = node.key[i] then return(node, i) ifnode.leaf!= TRUE then child = DiskRead(node.c[i]) returnBTreeLookup(child, key) end if returnNULL end function Количество чтений с диска: 푇푅푒푎푑=푂ℎ=푂(log푡푛) Вычислительная сложность: 푇=푂푡ℎ=푂(푡log푡푛) Как ускорить поиск ключа в узле? Двоичный поиск (Binarysearch) за время O(log2t) T= O(log2t∙ logtn) O(t)
  • 26. Создание пустого B-дерева (Create) 26 functionBTreeCreate() 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 3 1 5 B-дерево Вставка ключа 6
  • 28. Добавление ключа (Insert) 28 3)Если лист заполнен (содержит 2t–1ключей), то разбиваем его(split)на 2 листа по t–1 ключей – среди ключей листа key1<key2<…<keynи ключа keyотыскиваем медиану (mediankey) –средний ключ разделитель 4)Ключ медиана вставляется в родительский узел. Если родительский узел заполнен, то он разбивается и процедура повторяется по описанной выше схеме. Подъем вверх по дереву может продолжаться до корня
  • 29. Добавление ключа (Insert)в 2-3 B-дерево 29 4 5 7 6 2 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 functionBTreeSplitNode(node, parent, i) z = DiskAllocateNode() z.leaf= node.leaf z.n= t –1 /* Половина ключей перемещаются в новый узел*/ forj = 1 tot –1 do z.key[j] = node.key[t + j] end for ifnode.leaf= FALSE then forj = 1 tot do z.c[j] = node.c[t + j] end for end if
  • 32. Разбиение узла (Split) /* В node остается меньшая половина ключей*/ node.n= t –1 /* Вставляем ключ в родительский узел */ forj = parent.n+ 1 downtoi + 1 do parent.c[j + 1] = parent.c[j] end for parent.c[i + 1] = z forj = parent.ndowntoi 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 functionBTreeInsert(root, key) ifroot.n= 2t –1 then newroot= DiskAllocateNode() newroot.leaf= FALSE newroot.n= 0 newroot.c[1] = root BTreeSplitNode(root, newroot, 1) returnBTreeInsertNonfull(newroot, key) end if returnBTreeInsertNonfull(root, key) end function
  • 34. Добавление ключа (Insert) functionBTreeInsertNonfull(node, key) i = node.n ifnode.leaf= TRUE then whilei > 1 ANDkey < 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 whilei > 1 ANDkey < node.key[i] do i = i -1 end while i = i + 1 DiskRead(node.c[i]) 34
  • 35. Добавление ключа (Insert) 35 ifnode.c[i].n = 2t –1 then BTreeSplitNode(node.c[i], node, i) ifkey > node.key[i] then i = i + 1 end if end if node = BTreeInsertNonfull(node.c[i], key) end if returnnode end function Вычислительная сложность вставки ключа в B-деревов худшем случае (разбиваем узлы на каждом уровне): 푇=푂푡ℎ=푂(푡log푡푛) Количество дисковых операций: 푇퐷푖푠푘=푂ℎ=푂(log푡푛)
  • 36. Удаление ключа (Delete) 36 Находим узел, содержащий искомый ключ key Если ключ keyнаходится в листе, то удаляем ключ из него Если количество ключей стало меньше t –1, выполняем восстановление свойств B-дерева … Изучить самостоятельно [CLRS3ed, С. 536]
  • 37. Виды B-деревьев 37 B+-дерево (B+-tree)–это B-дерево, в котором только листья содержат информацию, а внутренние узлы хранят только ключи индексация метаданных в файловых системах Btrfs, NTFS, ReiserFS, NSS, XFS, JFS индексы таблиц в СУБД IBM DB2, Informix, Microsoft SQL Server, Oracle 8, Sybase ASE, SQLite B*-дерево (B*-tree)–это B-дерево, в котором каждый узел (за исключением корня) должен содержать не менее 2/3 ключей(а не 1/2 как в B-дереве)
  • 38. Реализация 2-3-4 B-tree 38 /* Minimum degree of B-tree */ #define T 2 /* 2-3-4 B-tree */ structbtree{ intleaf; intnkeys; int*key; int*value; structbtree**child; };
  • 39. Реализация B-tree 39 structbtree*btree_create() { structbtree*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); returnnode; }
  • 40. Реализация B-tree voidbtree_lookup(structbtree*tree, intkey, structbtree**node, int*index) { inti; 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; } } 40
  • 41. Реализация B-tree structbtree*btree_insert(structbtree*tree, intkey, intvalue) { structbtree*newroot; if(tree == NULL) { tree = btree_create(); tree->nkeys= 1; tree->key[0] = key; tree->value[0] = value; returntree; } 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); returnbtree_insert_nonfull(newroot, key, value); } returnbtree_insert_nonfull(tree, key, value); } 41
  • 42. Реализация B-tree voidbtree_split_node(structbtree*node, structbtree*parent, intindex) { structbtree*z; inti; 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; 42
  • 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 */ } 43
  • 44. Реализация B-tree structbtree*btree_insert_nonfull( structbtree*node, intkey, intvalue) { inti; 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{ 44
  • 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); } returnnode; } 45
  • 46. Реализация B-tree intmain() { structbtree*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); return0; } 46
  • 47. Внешняя сортировка слиянием 47 Внешняя сортировка (External sorting)–это класс алгоритмов сортировки, которые оперируют данными размещенными на внешней памяти Как отсортировать 300 GiBданных на жестком диске имея 2GiBоперативной памяти?
  • 48. Внешняя сортировка слиянием 48 Внешняя сортировка (External sorting)–это класс алгоритмов сортировки, которые оперируют данными размещенными на внешней памяти Как отсортировать 300 GiBданных на жестком диске имея 2GiBоперативной памяти? 1.Загружаем блок размером 2 GiBв оперативную память 2.Сортируем блок (MergeSort, QuickSort, CountingSort, …)и сохраняем на внешнюю память (диск) 3.Повторяем шаги 1 и 2, пока на получим 300 / 2 = 150 отсортированных блоков на внешней памяти 4.Создаем в оперативной памяти 151 буфер по 13 KiB(2GiB/ 151 ≈ 13 KiB) 5.Загружаем в 150 буферов по 13 KiBиз отсортированных блоков,151-йбуфер –это выходной блок 6.В выходной блок сливаем (merge) данные из 150 буферов и записываем его на внешнюю память 7.Повторяем шаги 5 и 6 пока не сольем все 150 блоков
  • 49. Внешняя сортировка слиянием 49 Внешняя сортировка (External sorting)–это класс алгоритмов сортировки, которые оперируют данными размещенными на внешней памяти Как отсортировать 300 GiBданных на жестком диске имея 2GiBоперативной памяти? 1.Загружаем блок размером 2 GiBв оперативную память 2.Сортируем блок (MergeSort, QuickSort, CountingSort, …)и сохраняем на внешнюю память (диск) 3.Повторяем шаги 1 и 2, пока на получим 300 / 2 = 150 отсортированных блоков на внешней памяти 4.Создаем в оперативной памяти 151 буфер по 13 KiB(2GiB/ 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
  • 50. Задания 50 Рассмотреть применение B-деревьев в файловых системах – что содержит поле “ключ” (key)и поле “значение”(value) Привести пример значения t, используемого в файловой системеBtrfs Изучить применение B-деревьев в системах управления базами данных(MySQL, PostgreSQL, Microsoft SQL Server, IBM DB2 и др.): какие задачи они решают, что хранится в поле “ключ” (key) и поле “значение”(value)