- B-дерево - это особый тип самобалансирующегося дерева поиска, в котором каждый узел может содержать более одного ключа и может иметь более двух дочерних элементов.
- Потребность в B-дереве возникла вместе с ростом потребности в меньшем времени доступа к физическим носителям информации, таким как жесткий диск. Вторичные запоминающие устройства работают медленнее и имеют большую емкость. Существовала потребность в таких типах структур данных, которые минимизировали бы доступ к диску.
- Другие структуры данных, такие как бинарное дерево поиска, avl-дерево, красно-черное дерево и т.д., могут хранить только один ключ в одном узле. Если нужно хранить большое количество ключей, то высота таких деревьев становится очень большой и время доступа увеличивается.
- B-дерево может хранить множество ключей в одном узле и иметь несколько дочерних узлов. Это значительно уменьшает высоту, позволяя ускорить доступ к диску.
Основные свойства B-tree:
- Для каждого узла
xключи хранятся в порядке возрастания. - В каждом узле есть логическое значение
x.leaf, которое истинно, еслиxэто лист. - Если
nэто порядок дерева, то каждый внутренний узел может содержать не болееn - 1ключей вместе с указателем на каждого дочернего. - Каждый узел, кроме корня, может иметь не более
nдочерних элементов и не менееn/2дочерних. - Все листья имеют одинаковую глубину (то есть высоту - h дерева).
- Корень имеет как минимум 2 дочерних элемента и содержит как минимум 1 ключ.
- Если
n ≥ 1, то для любого n-ключа B-дерева высоты h и минимальной степениt ≥ 2,h ≥ log<sub>t</sub> (n+1)/2.
Основные операции: поиск, вставка, удаление.
- Теоретическая сложность операций:
- Операция поиска выполняется за время O(t logt n).
- Операция вставки выполняется за время O(t logt n).
- Операция удаления выполняется за время O(t logt n).
| Фамилия Имя | Вклад (%) | Прозвище | Роль |
|---|---|---|---|
| Шкалин Вячеслав | 80 | Человек-full | Код, реализация, бенчмарки, readme |
| Гайсова Ольга | 20 | nullptr | Презентация, отчёт |
Девиз команды
Как-нибудь справимся!
Проект состоит из следующих частей:
src/include- реализация структуры данных (исходный код и заголовочные файлы);benchmark- контрольные тесты производительности структуры данных (операции добавления, удаления, поиска);dataset- наборы данных для запуска контрольных тестов и их генерация;
Рекомендуемые требования:
- С++ компилятор c поддержкой стандарта C++17 (например, GNU GCC 8.1.x и выше).
- Система автоматизации сборки CMake (версия 3.12.x и выше).
- Интерпретатор Python (версия 3.7.x и выше).
- Рекомендуемый объем оперативной памяти - не менее 6 ГБ.
- Свободное дисковое пространство объемом ~ 1,5 ГБ (набор данных для контрольных тестов).
Инструкция по сборке проекта, генерации тестовых данных, запуска контрольных тестов и примеров работы.
Склонируйте проект к себе на устройство через Git for Windows (либо используйте возможности IDE):
git clone https://github.com/Algorithms-and-Data-Structures-2021/semester-work-b-tree-11-004.gitГенерация тестового набора данных в формате comma-seperated values (CSV):
Инструкция по запуску скрипта:
| Номер шага | Папки и файлы |
|---|---|
| 1) Перейдите в папку генерации набора данных. | dataset |
| 2) Откройте файл. | generate_csv_dataset.cpp |
| 3) Запустите метод. | main() |
| 4) В папке dataset есть папка data, в ней еще 3 папки (remove, find, insert). | data |
| 5) После запуска скрипта, в этих папках появятся файлы для контрольного тестирования. | remove, find, insert |
По названию директории /dataset/data/insert можно понять, что здесь хранятся наборы данных для контрольных тестов по
добавлению элементов в структуру данных. Названия файлов 100.csv. 5000000.csv и т.д. хранят информацию о размере
набора данных (т.е. количество элементов).
Для запуска контрольных тестов необходимо предварительно сгенерировать или скачать готовый набор тестовых данных (в случае скачивания, заменить исходную папку data на скачанную).
Примечание. Если вы не хотите "захламлять" проект большим объёмом данных, вы можете скачать наборы данных для контрольного тестирования, перейдя по ссылке на Google Drive.
| Название | Описание | Метрики |
|---|---|---|
find_benchmark |
поиск элементов в структуре | время |
insert_benchmark |
добавление элементов в структуру данных | время |
remove_benchmark |
удаление всех элементов из структуры | время |
| Номер шага | Папки и файлы |
|---|---|
| 1) Перейдите в папку с контрольными тестами. | benchmark |
| 2) В папке есть 3 файла с контрольными тестами, по названию понятно, какой метод они тестируют. Откройте один из них. | remove_benchmark.cpp, find_benchmark.cpp, insert_benchmark.cpp |
| 3) Запустите метод | main(). Из-за большого объема данных, метод выполняется довольно долго, пожалуйста, подождите какое-то время. |
| 4) В папке result есть 3 файла с метриками. После прогона одного из контрольных тестов, файл, который привязан к определенному бенчмарку, отобразит результаты тестирования. | result, eraseResults.csv, findResults.csv, insertResults.csv |
В файлы записываются как 3 числа через запятую:
- Количество данных в наборе (от 100 до 5 млн)
- Номер прогона на наборе данных (от 1 до 10)
- Затраченное время (измеряется в наносекундах)