Красно-черное дерево - бинарное дерево поиска, в котором механизм самобалансирования осуществляется на основе цвета узла дерева, который принимает одно из двух значений — красный или черный.
Красно-черное дерево следует следующим правилам:
- Каждый узел — красный либо черный.
- Корень и все конечные узлы (листья) — черные.
- У черного узла дочерние узлы могут быть любого цвета.
- У красного узла оба дочерних узла — черные.
- Каждый путь от корня до конечного узла содержит одинаковое количество черных вершин.
Последние 2 правила гарантируют, что пути от корня до ближайшего и до самого дальнего
листьев отличаются не более, чем в 2 раза. Как итог, дерево примерно сбалансировано и
имеет высоту h = log n
.
Красно-черные деревья предлагают гарантированное время вставки, поиска и удаления в худших случаях, что не только делает их ценными в приложениях, зависимых от времени, но и делает их ценными в качестве основы для других структур данных, также дающих гарантированное время в худшем случае (например, AVL-дерево).
Ниже приведена временная сложность структуры:
Операция | В среднем | В худшем случае |
---|---|---|
Вставка | O(log(n)) |
O(log(n)) |
Поиск | O(log(n)) |
O(log(n)) |
Удаление | O(log(n)) |
O(log(n)) |
Проект состоит из следующих частей:
src
/include
- реализация структуры данных (исходный код и заголовочные файлы);benchmark
- контрольные тесты производительности структуры данных (операции добавления, удаления, поиска и пр.);examples
- примеры работы со структурой данных;dataset
- наборы данных для запуска контрольных тестов и их генератор;
- С++ компилятор c поддержкой стандарта C++17 (например, GNU GCC 8.1.x и выше).
- Система автоматизации сборки CMake (версия 3.12.x и выше).
- Java Runtime Environment (JRE) версии 8 и выше.
- Рекомендуемый объем оперативной памяти - не менее 8 ГБ.
- Свободное дисковое пространство объемом ~ 2 ГБ (набор данных для контрольных тестов).
Склонируйте проект к себе на устройство через Git for Windows (либо используйте возможности IDE):
git clone https://github.com/beleavemebe/red-black-tree.git
Для ручной сборки проекта в терминале введите:
# переход в папку с проектом
cd C:\Users\username\asd-projects\red-black-tree
# создание папки для файлов сборки (чтобы не засорять папку с проектом)
mkdir -p build && cd build
# сборка проекта
cmake .. -DCMAKE_BUILD_TYPE=RelWithDebInfo && cmake --config RelWithDebInfo --build .
Генерация тестового набора данных в формате LSD (line separated digits):
# переход в папку генерации набора данных
cd dataset
# запуск исполняемого файла JAR
java -jar Generator.jar <x> [y]
<x>
- количество генерируемых наборов данных;[y]
- максимальное количество чисел в последнем сгенерированном файле каждого набора (по умолчанию - 5 000 000)
Первая строка - количество чисел в файле (совпадает с именем файла)
Последующие строки содержат случайные числа
100
1429
79245
59372
...
Генератор автоматически разложит данные по папкам как показано ниже:
dataset/
data/
add/
1/
100.txt
...
5000000.txt
2/
...
3/
...
...
10/
...
search/
1/
100.txt
...
5000000.txt
...
10/
...
remove/
1/
100.txt
...
5000000.txt
...
10/
...
...
Для запуска контрольных тестов необходимо предварительно сгенерировать набор(-ы) тестовых данных.
Название | Описание | Метрики |
---|---|---|
global_benchmark |
Тестирование вставки, поиска и удаления | время |
# Переход в папку с собранным проектом
cd build
# Переход в папку с исполняемым файлом тестирования
cd benchmark
# Запуск бенчмарка на готовых наборах
./global_benchmark <t>
# Просмотр готовых замеров времени в наносекундах (дублируются в консоль)
nvim metrics.tsv
<t>
- количество прогонов для каждого набора