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

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

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

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

6. 1. Варианты деревьев 1970 г. Джон Хопкрофт (John E. Hopcroft) – 2 -3 6. 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. В-деревья Сбалансированные деревья поиска, созданные специально для работы с внешней памятью Сильно 6. 2. В-деревья Сбалансированные деревья поиска, созданные специально для работы с внешней памятью Сильно ветвящиеся (многоходовые) деревья: каждый узел имеет 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. Структура узла • Текущее количество ключей в узле • Значения ключей и 6. 4. Структура узла • Текущее количество ключей в узле • Значения ключей и сопутствующая ключам информация • Указатели на дочерние узлы (для листьев здесь 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]; – указатели на дочерние узлы struct Node *parent; – указатель на родительский узел }; 6

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

6. 7. Поиск в В-дереве Просмотр ключей узла дерева: key 0 < key 1 6. 7. Поиск в В-дереве Просмотр ключей узла дерева: key 0 < key 1 < … < keyn – 1 цикл по i = 0, 1, …, n – 1 и k > keyi : for(i = 0; i < n && k > key[i]; ++i) ; 10

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

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 12

6. 8. B_Tree_Search(x, k) while x ≠ NULL { i=0 Поиск положения в узле 6. 8. B_Tree_Search(x, k) 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 13

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

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

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

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

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

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

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

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

6. 15. Вставка ключа 50 root 12 20 24 29 32 84 35 45 6. 15. Вставка ключа 50 root 12 20 24 29 32 84 35 45 50 96 22

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

6. 22. Ситуация 1 переместить крайний ключ из z в x и переместить соответствующий 6. 22. Ситуация 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 . . . 39

6. 22. Ситуация 1 else if y и оба его непосредственных соседа содержат только 6. 22. Ситуация 1 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 40

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

6. 23. Ситуация 2 x – внутренний узел дерева, ключ k находится в узле 6. 23. Ситуация 2 x – внутренний узел дерева, ключ k находится в узле x y – узел, левый потомок для ключа k z – правый потомок для ключа k 42

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

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

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

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

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

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