
- •Лабораторные работы по программированию "Структуры и алгоритмы обработки данных"
- •Задание к лабораторной работе
- •Варианты задания
- •Методические указания по выполнению задания
- •Задание к лабораторной работе
- •Варианты задания
- •Методические указания по выполнению задания
- •Задание к лабораторной работе
- •Варианты задания
- •Методические указания по выполнению задания
- •Задание к лабораторной работе
- •Варианты задания
- •Методические указания по выполнению задания
- •Задание к лабораторной работе
- •Варианты задания
- •Методические указания по выполнению задания
- •Методические указания по выполнению задания (окончание)
- •Задание к лабораторной работе
- •Варианты задания
- •Методические указания по выполнению задания
- •Литература
- •Хранение данных в файлах
- •Простая организация данных
- •Ускорение операций с файлами
- •Хешированные файлы
- •Хешированные файлы (окончание)
- •Индексированные файлы
- •Индексированные файлы (окончание)
- •Несортированные файлы с плотным индексом
- •Внешние деревья поиска
- •Разветвленные деревья поиска
- •Создание пустого б-дерева
- •Создание пустого б-дерева (продолжение)
- •Создание пустого б-дерева (продолжение)
- •Создание пустого б-дерева (окончание)
- •Сравнение методов
- •Формат атд
- •Формат атд (окончание)
- •Вариант 8:
- •Атд "Хеш-таблица с цепочками коллизий"
- •Атд "Хеш-таблица с цепочками коллизий" (окончание)
- •Атд "Хеш-таблица с открытой адресацией"
- •Атд "Хеш-таблица с открытой адресацией" (окончание)
- •Атд "Итератор"
- •Описание методики тестирования хеш-функции (определение статистики c2)
- •Описание хеш-функций
- •Результаты тестирования хеш-функции
- •Описание методики тестирования трудоемкости операций
- •Описание методики тестирования трудоемкости операций (окончание)
- •Сравнительный анализ теоретических и экспериментальных оценок эффективности операций
- •Литература
Создание пустого б-дерева
Чтобы построить дерево, сначала создается пустое дерево с помощью операции B_Tree_Create, а затем в него включаются элементы с помощью операции B_Tree_Insert. Обе эти операции используют вспомогательную операцию Allocate_Node, которая выделяет на диске место для нового узла. Эта операция занимает 0(1) времени и не использует операцию Disk_Read.
B_Tree_Create(T)
1. x <- Allocate_Node()
2. leaf [x] <- TRUE
3. n[x] <- 0
4. Disk_Write (x)
5. root[T] <- x
Операция требует 0(1) времени, т.к. выполняется одно обращение к диску.
Операция разбиения узла Б-дерева. Ключевым моментом добавления элемента в дерево является разбиение полного узла у с2t-1 ключами на два узла, имеющие по t-1 элементов в каждом. При этом ключ-медиана отправляется к родителю узла y - x. Этот ключ становится разделителем двух полученных узлов. Ключ-медиана вставляется в упорядоченное множество ключей узла х.
Элементы с большими, чем медиана ключами, переходят в новый узел z. Входными параметрами операции является неполный узел х, число i и полный узел y (y=pi[x]).
B_Tree_Split (x, i, y)
1. z <- Allocate_Node()
2. leaf [z] <- leaf [y]
3. n[z] <- t-1
4. for j <- 1 to t-1
5. dv keyj[z] <- keyj+1[y]
6. if not leaf [y]
7. then for j <- 1 to t
8. dv pj[z] <- pj+1[y]
9. n[y] <- t-1
10. for j <- n[x]+1 downto i+1
11. dv pj+1[x] <- pj[x]
12. pj+1[x] <- z
13. for j <- n[x] downto i
14. dv keyj+1[x] <- keyj[x]
15. keyi[x] <- keyt[y]
16. n[x] <- n[x+1]
17. Disk_Write [x]
18. Disk_Write [y]
19. Disk_Write [z]
Добавление элемента в Б-дерево. Операции при включении проходит по одному из путей поиска от корня к месту. Для этого требуется время 0(th)=0(t logtn) и 0(h) обращений к диску. На пути поиска встречающиеся полные узлы расщепляются с помощью операции B_Tree_Split.
Создание пустого б-дерева (продолжение)
B_Tree_Insert (T, k)
1. r <- root[T]
2. if n[r]=2t-1
3. then
4. s <- Allocate_Node()
5. root <- s
6. leaf[s] <- FALSE
7. n[s] <- 0
8. p1[s] <- 2
9. B_Tree_Split (S, 1, r)
10. B_Tree_Insert_Nonfull (s, k)
11. else B_Tree_Insert_Nonfull (r, k)
Точкой роста Б-дерева является не лист, а корень.
Новый корень содержит ключ-медиану старого корня.
Сделав корень неполным (или он не был таковым с самого начала), мы вызываем операцию B_Tree_Insert_Nonfull (x, k), которая добавляет элемент k в поддерево с корнем в неполном узле х. Это рекурсивная операция.
B_Tree_Insert_Nonfull (x, k)
1. i <- n[x]
2. if leaf[x]=TRUE
3. then while i 1 and k < keyi[x]
4. dv keyi+1[x] <- keyi[x]
5. i <- i-1
6. keyi+1[x] <- k (данные)
7. n[x] <- n[x]+1
8. Disk_Write [x]
9. else while i 1 and k < keyi[x]
10. dv i <- i-1
11. i <- i+1
12. Disk_Read (pi[x])
13. if n[p[x]]=2t-1
14. then B_Tree_Split (x, i, pi[x])
15. if k > keyi[x]
16. then i <- i+1
17. B_Tree_ Insert_Nonfull (pi[x], k)