beleavemebe / red-black-tree

Red Black Tree basic implementation with benchmark

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Red-Black Tree

CMake

Красно-черное дерево - бинарное дерево поиска, в котором механизм самобалансирования осуществляется на основе цвета узла дерева, который принимает одно из двух значений — красный или черный.

Красно-черное дерево следует следующим правилам:

  • Каждый узел — красный либо черный.
  • Корень и все конечные узлы (листья) — черные.
  • У черного узла дочерние узлы могут быть любого цвета.
  • У красного узла оба дочерних узла — черные.
  • Каждый путь от корня до конечного узла содержит одинаковое количество черных вершин.

Последние 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 - наборы данных для запуска контрольных тестов и их генератор;

Требования (Prerequisites)

  1. С++ компилятор c поддержкой стандарта C++17 (например, GNU GCC 8.1.x и выше).
  2. Система автоматизации сборки CMake (версия 3.12.x и выше).
  3. Java Runtime Environment (JRE) версии 8 и выше.
  4. Рекомендуемый объем оперативной памяти - не менее 8 ГБ.
  5. Свободное дисковое пространство объемом ~ 2 ГБ (набор данных для контрольных тестов).

Сборка и запуск

Пример (Windows)

Сборка проекта

Склонируйте проект к себе на устройство через 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/ 
          ...  
      ...

Контрольные тесты (benchmarks)

Для запуска контрольных тестов необходимо предварительно сгенерировать набор(-ы) тестовых данных.

Список контрольных тестов
Название Описание Метрики
global_benchmark Тестирование вставки, поиска и удаления время
Примеры запуска
# Переход в папку с собранным проектом
cd build

# Переход в папку с исполняемым файлом тестирования 
cd benchmark

# Запуск бенчмарка на готовых наборах
./global_benchmark <t>

# Просмотр готовых замеров времени в наносекундах (дублируются в консоль)
nvim metrics.tsv
  • <t> - количество прогонов для каждого набора

Источники

About

Red Black Tree basic implementation with benchmark

License:MIT License


Languages

Language:C++ 61.1%Language:CMake 38.9%