Скачать презентацию 6 В деревья 6 1 Варианты деревьев Скачать презентацию 6 В деревья 6 1 Варианты деревьев

6 В-деревья.ppt

  • Количество слайдов: 47

6. В деревья 6. В деревья

6. 1. Варианты деревьев Случай 1 1970 г. Джон Хопкрофт (John E. Hopcroft) – 6. 1. Варианты деревьев Случай 1 1970 г. Джон Хопкрофт (John E. Hopcroft) – 2 -3 деревья: каждый внутренний узел имеет 2 или 3 дочерних узла, все листья – на одном уровне 2 -3 -4 деревья: каждый внутренний узел имеет 2, 3 или 4 дочерних узла 1972 г. Р. Байер (R. Bayer) и Э. Мак-Крэйт (E. M. Mc. Creight) – B деревья 2

6. 2. В-деревья Случай 1 Сбалансированные деревья поиска, созданные специально для работы с внешней 6. 2. В-деревья Случай 1 Сбалансированные деревья поиска, созданные специально для работы с внешней памятью Сильно ветвящиеся (многоходовые) деревья: каждый узел имеет n (n > 1) ключей и n + 1 дочерних узлов Значения ключей в узле упорядочены по возрастанию: k 1 k 2 … kn 3

6. 3. Определение В-дерева Случай 1 В-дерево степени t: • Каждый узел, кроме корня 6. 3. Определение В-дерева Случай 1 В-дерево степени t: • Каждый узел, кроме корня и листьев, имеет минимум t, максимум 2 t дочерних узлов • Каждый узел, кроме корня, содержит минимум t – 1, максимум 2 t – 1 ключей; узел заполнен, если он имеет ровно 2 t – 1 ключей • Корень имеет минимум 1 ключ и два дочерних узла • Все листья расположены на одной и той же глубине, которая равна высоте дерева h 4

6. 4. Структура узла Случай 1 • Текущее количество ключей в узле • Значения 6. 4. Структура узла Случай 1 • Текущее количество ключей в узле • Значения ключей и сопутствующая ключам информация • Указатели на дочерние узлы (для листьев здесь NULL) • Указатель на родительский узел Простейшее В-дерево степени 2 – 2 -3 -4 дерево 5

6. 4. Структура узла Случай 1 const int T = …; – степень дерева 6. 4. Структура узла Случай 1 const int T = …; – степень дерева struct Node { int n; – количество ключей в узле int key[2 * T – 1]; – значения ключей; key[0] key[1] … Node *ptr[2 * T]; – указатели на дочерние узлы Node *parent; – указатель на родительский узел }; 6

6. 5. Пример В-дерева Случай 1 В-дерево степени t с минимально возможным количеством ключей 6. 5. Пример В-дерева Случай 1 В-дерево степени t с минимально возможным количеством ключей 1 t– 1 t. . . t t– 1 . . . t– 1 t t t– 1. . . t– 1 7

6. 6. Высота В-дерева Случай 1 Теорема Высота В-дерева с n > 1 узлами 6. 6. Высота В-дерева Случай 1 Теорема Высота В-дерева с n > 1 узлами и минимальной степенью t 2 не превышает logt ((n + 1) / 2) 8

6. 7. Поиск в В-дереве Случай 1 Результат успешного поиска – указатель на узел 6. 7. Поиск в В-дереве Случай 1 Результат успешного поиска – указатель на узел дерева и положение искомого ключа в данном узле Результат не успешного поиска – NULL значение указателя Обозначения: k – искомый ключ x – указатель на корень дерева 9

6. 7. Поиск в В-дереве Случай 1 Просмотр ключей узла дерева: key 0 < 6. 7. Поиск в В-дереве Случай 1 Просмотр ключей узла дерева: key 0 < key 1 < … < keyn – 1 цикл по i = 0, 1, …, n – 1 и k > keyi Если k < key 0 (i = 0), должен быть выбран ptr 0 Если k > keyi – 1 и k < keyi, должен быть выбран ptri Если k > keyn – 1, должен быть выбран ptrn, или опять же ptri, так как здесь i = n 10

6. 7. Поиск% В-дереве в 1 Случай В-дерево степени 3 118 20 30 42 6. 7. Поиск% В-дереве в 1 Случай В-дерево степени 3 118 20 30 42 3 24 34 8 27 12 143 160 120 148 163 36 43 80 126 153 165 38 87 132 159 Ключ 39 173 Услех Отказ 39 41 11

6. 8. B_Tree_Search(x, k) Случай 1 while x ≠ NULL { i=0 Поиск положения 6. 8. B_Tree_Search(x, k) Случай 1 while x ≠ NULL { i=0 Поиск положения в узле дерева while i < x->n и k > x->key[i] i=i+1 Возможно, искомый ключ найден if i < x->n и k = x->key[i] успех: результат x и i 12

6. 8. B_Tree_Search(x, k) Случай 1 Продолжить поиск в соответствующем поддереве x = x->ptr[i] 6. 8. B_Tree_Search(x, k) Случай 1 Продолжить поиск в соответствующем поддереве x = x->ptr[i] } Если x = NULL, просмотрели лист – поиск не успешен Отказ: результат – NULL 13

6. 9. Вставка в 1 В-дерево Случай Новый элемент вставляется всегда в лист. Пустое 6. 9. Вставка в 1 В-дерево Случай Новый элемент вставляется всегда в лист. Пустое В-дерево – В-дерево с единственным листом, в котором нет ключей При создании новых узлов дерева все указатели устанавливаются в NULL 14

6. 9. Вставка в 1 В-дерево Случай Поиск целевого листа if лист не полон 6. 9. Вставка в 1 В-дерево Случай Поиск целевого листа if лист не полон { Вставка в лист нового ключа Успех } Разбиение (splitting) листа Перемещение медианы в родительский узел 15

6. 10. Пример Случай 1 В-дерево порядка 2 a) В-дерево пусто root b) Последовательно 6. 10. Пример Случай 1 В-дерево порядка 2 a) В-дерево пусто root b) Последовательно вставляются ключи 12, 45 и 32 root 12 45 32 16

6. 11. Вставка ключа 20 Случай 1 Разбиение листа (корня) root 12 32 20 6. 11. Вставка ключа 20 Случай 1 Разбиение листа (корня) root 12 32 20 45 Вставка ключа 20 17

6. 12. Вставка ключей Случай 1 Вставляются ключи 24, 84 и 96 root 32 6. 12. Вставка ключей Случай 1 Вставляются ключи 24, 84 и 96 root 32 12 20 24 45 84 96 18

6. 13. Вставка ключа 29 Случай 1 Разбиение листа root 12 20 32 24 6. 13. Вставка ключа 29 Случай 1 Разбиение листа root 12 20 32 24 29 45 84 96 Вставка ключа 29 19

6. 14. Вставка ключа 35 Случай 1 root 20 12 24 32 29 45 6. 14. Вставка ключа 35 Случай 1 root 20 12 24 32 29 45 84 96 Разбиение листа root 12 20 24 29 32 84 35 45 96 Вставка ключа 35 20

6. 15. Вставка ключа 50 Случай 1 root 12 20 24 29 32 84 6. 15. Вставка ключа 50 Случай 1 root 12 20 24 29 32 84 35 45 50 96 21

6. 16. Вставка ключа 63 Случай 1 Разбиение корневого узла root 32 20 12 6. 16. Вставка ключа 63 Случай 1 Разбиение корневого узла root 32 20 12 84 24 29 35 45 50 96 22

6. 16. Вставка ключа 63 Случай 1 Разбиение листа root 32 20 45 12 6. 16. Вставка ключа 63 Случай 1 Разбиение листа root 32 20 45 12 84 96 35 24 29 50 23

6. 16. Вставка ключа 63 Случай 1 Вставка ключа root 32 20 45 12 6. 16. Вставка ключа 63 Случай 1 Вставка ключа root 32 20 45 12 84 96 35 24 29 50 63 24

Разбиение узла x – родительский узел i – позиция, определяющая положение разбиваемого узла y Разбиение узла x – родительский узел i – позиция, определяющая положение разбиваемого узла y = ptri – указатель на разбиваемый узел x y . . . ptri . . . keyi ptri+1 . . . key 0. . . keyn/2. . . keyn-1 25

B_Tree_Split(x, i) (1) m – количество ключей в узле x (m < 2 t B_Tree_Split(x, i) (1) m – количество ключей в узле x (m < 2 t – 1) Сдвинуть в узле x ключи и указатели, начиная с i, на 1 позицию вправо y = ptri n – количество ключей в узле y (n = 2 t – 1) Создать новый узел z, установить в этом узле все указатели в NULL 26

B_Tree_Split(x, i) (2) Переместить в узел z из узла y ключи и указатели, начиная B_Tree_Split(x, i) (2) Переместить в узел z из узла y ключи и указатели, начиная с позиции j = n/2 + 1 Включить в x указатель на новый узел z: x ->ptri+1 = z Включить в узел x медианный ключ из узла y: x->keyi = y->keyn/2 Скорректировать количество ключей в узлах x, y и z 27

Вставка в В-дерево (1) root – указатель на корень В-дерева k – ключ нового Вставка в В-дерево (1) root – указатель на корень В-дерева k – ключ нового элемента r = root if корень заполнен полностью { создать новый узел s s->n = 0 s->ptr 0 = r 28

Вставка в В-дерево (2) root = s разбить корень дерева: B_Tree_Split(s, 0) r=s } Вставка в В-дерево (2) root = s разбить корень дерева: B_Tree_Split(s, 0) r=s } Вставить новый элемент в незаполненный узел В-дерева: B_Insert_Nonfull(r, k) 29

B_Insert_Nonfull(x, k) (1) x – указатель на незаполненный узел B-дерева k – ключ нового B_Insert_Nonfull(x, k) (1) x – указатель на незаполненный узел B-дерева k – ключ нового элемента while x – не лист { i = позиция, определяющая положение нового ключа: x->keyi – 1 < k x->keyi if k = x->keyi отказ: дублирование ключей 30

B_Insert_Nonfull(x, k) (2) s = x->ptri – поддерево, в котором должен размещаться ключ k B_Insert_Nonfull(x, k) (2) s = x->ptri – поддерево, в котором должен размещаться ключ k if узел s заполнен полностью { разбить узел: B_Tree_Split(x, i) выбрать нужное поддерево: if k > x->keyi s = x->ptri + 1 } – конец if 31

B_Insert_Nonfull(x, k) (3) x=s } – конец while x – указывает на лист В-дерева, B_Insert_Nonfull(x, k) (3) x=s } – конец while x – указывает на лист В-дерева, не заполненный полностью if в листе x есть ключ k отказ: дублирование ключей Вставить в узел x новый ключ k, не нарушая упорядоченности 32

Удаление элемента (1) • Удаляемый элемент находится в листе: корректируется лист • Удаляемый элемент Удаление элемента (1) • Удаляемый элемент находится в листе: корректируется лист • Удаляемый элемент находится в промежуточном узле дерева – он заменяется следующим за ним (или предшествующим ему) значением: корректируется лист 33

Удаление элемента (2) root 32 20 12 84 24 29 39 35 45 50 Удаление элемента (2) root 32 20 12 84 24 29 39 35 45 50 96 1. Удаляется элемент с ключом 50 2. Удаляется элемент с ключом 20 34

Удаление элемента (3) Найти удаляемый ключ: x – узел дерева, содержащий удаляемый ключ k Удаление элемента (3) Найти удаляемый ключ: x – узел дерева, содержащий удаляемый ключ k if x – не лист { y = самый левый лист из правого поддерева на место удаляемого ключа переместить первый ключ из y x = y, k = y->key 0 } 35

Удаление элемента (4) Удалить ключ k из листа x if в листе x возникло Удаление элемента (4) Удалить ключ k из листа x if в листе x возникло антипереполнение скорректировать структуру В-дерева Способы коррекции: • перераспределение ключей • слияние узлов 36

Схема удаления: ситуация 1 x – внутренний узел дерева, ключ k отсутствует в узле Схема удаления: ситуация 1 x – внутренний узел дерева, ключ k отсутствует в узле x y = ptri – поддерево, которое должно содержать k if y содержит только t – 1 ключей, но один из его непосредственных соседей (z) содержит t ключей { переместить ключ-разделитель из x в y 37

Ситуация 1 (1) переместить крайний ключ из z в x и переместить соответствующий указатель Ситуация 1 (1) переместить крайний ключ из z в x и переместить соответствующий указатель из z в y } x . . . ki-1 ki y k 0 k 1 . . . kt-1 p . . . z p 0 k 1 . . . kt p 1 . . . 38

Ситуация 1 (2) else if y и оба его непосредственных соседа содержат только по Ситуация 1 (2) else if y и оба его непосредственных соседа содержат только по t – 1 ключей объединить y с одним из его соседей x . . . ki-1 ki y k 0 k 1 . . . kt-1 p . . . z k 0 p 0 k 1 . . . Kt-1 p 1 39

Ситуация 1 (3) Гарантированно узел y будет содержать t ключей Выполнить процедуру удаления ключа Ситуация 1 (3) Гарантированно узел y будет содержать t ключей Выполнить процедуру удаления ключа k из поддерева с корнем y 40

Ситуация 2 (1) x – внутренний узел дерева, ключ k находится в узле x Ситуация 2 (1) x – внутренний узел дерева, ключ k находится в узле x y – узел, левый потомок для ключа k z – правый потомок для ключа k 41

Ситуация 2 (2) if y содержит t ключей { найти k’ – предшественника k Ситуация 2 (2) if y содержит t ключей { найти k’ – предшественника k в поддереве с корнем y заменить в x ключ k на k’ выполнить процедуру удаления ключа k’ из поддерева с корнем y } 42

Ситуация 2 (3) else if z содержит t ключей { найти k’ – следующий Ситуация 2 (3) else if z содержит t ключей { найти k’ – следующий за k в поддереве с корнем z заменить в x ключ k на k’ выполнить процедуру удаления ключа k’ из поддерева с корнем z } 43

Ситуация 2 (4) else { и y, и z содержат только по t – Ситуация 2 (4) else { и y, и z содержат только по t – 1 ключей переместить k и все ключи и указатели из z в y освободить z выполнить процедуру удаления ключа k из поддерева с корнем y } 44

Ситуация 2 (5) x – корень дерева, содержит только один ключ – k y Ситуация 2 (5) x – корень дерева, содержит только один ключ – k y и z – левый и правый узлы-потомки, содержат только по t – 1 ключу При объединении ключей корень x опустошается – и узел y становится новым корнем дерева 45

Пример: В-дерево степени 2 Удалить ключ 56 x = root y 36 56 z Пример: В-дерево степени 2 Удалить ключ 56 x = root y 36 56 z 63 46

Ситуация 3 x – лист дерева, и ключ k находится в листе x Удалить Ситуация 3 x – лист дерева, и ключ k находится в листе x Удалить ключ k из листа x 47