Краткое описание семестрового проекта.
Disjoint-set (система непересекающихся множеств) также называется Union-find. Представляет из себя множество элементов, разбитое на непересекающиеся подмножества, которые в представленной реализации являются деревьями. При этом каждому подмножеству назначается его представитель — элемент этого подмножества (корень дерева). Структура данных определяется множеством трёх операций: Union, Find, make_set. Find(x) возвращает представителя подмножества, в котором находится x. Union(x, y) объединяет множество, к которому принадлежит x, и множество, к которому принадлежит y. Применяется для хранения компонент связности в графах, в частности, алгоритму Краскала необходима подобная структура данных для эффективной реализации.
Есть много вариантов реализации структуры данных.
| Фамилия Имя | Вклад (%) | Прозвище |
|---|---|---|
| Касимов Дамир | 100 |
Девиз команды
Наши цели ясны. Задачи определены. За работу, товарищи!
Описание основных частей семестрового проекта.
Проект состоит из следующих частей:
src/include- реализация структуры данных (исходный код и заголовочные файлы);benchmark- контрольные тесты производительности структуры данных;examples- примеры работы со структурой данных;dataset- наборы данных для запуска контрольных тестов и их генерация;
В этом разделе задаются основые требования к программному и аппаратному обеспечению для успешной работы с проектом.
Пример. Рекомендуемые требования:
- С++ компилятор c поддержкой стандарта C++17 (например, GNU GCC 8.1.x и выше).
- Система автоматизации сборки CMake (версия 3.12.x и выше).
- Интерпретатор Python (версия 3.7.x и выше).
- Рекомендуемый объем оперативной памяти - не менее 6 ГБ.
- Свободное дисковое пространство объемом ~ 3 ГБ (набор данных для контрольных тестов).
Инструкция по сборке проекта, генерации тестовых данных, запуска контрольных тестов и примеров работы.
Склонируйте проект к себе на устройство через Git for Windows (либо используйте возможности IDE):
git clone https://github.com/Algorithms-and-Data-Structures-2021/semester-work-disjoint-set-03Для ручной сборки проекта в терминале введите:
# переход в папку с проектом
cd C:\Users\username\asd-projects\semester-work-disjoint-set-03
# создание папки для файлов сборки (чтобы не засорять папку с проектом)
mkdir -p build && cd build
# сборка проекта
cmake .. -DCMAKE_BUILD_TYPE=RelWithDebInfo && cmake --config RelWithDebInfo --build . Генерация тестового набора данных в формате comma-separated values (CSV):
# переход в папку генерации набора данных
cd dataset
# запуск Python-скрипта
python generate_csv_bench_dataset_join.py --datasets 10 --samples 100Создаст 10 наборов данных по 100 элементов.
--samples- количество генерируемых элементов;--datasets- количество генерируемых наборов данных;
Тестовые данные представляют собой последовательность объединений, которые создадут струтуру данных из дефолтной структуры (100 элементов, каждый в своем сете).
Тестовые данные представлены в CSV формате (см.
dataset/data/dataset-example.csv):
num1, num2
0, 1
1, 5
...
Данные организованы в директориях:
dataset/data/
join/
01/
100.csv
...
5000000.csv
02/ ...
03/ ...
...
10/ ...
...Директории с названиями 01, 02 и т.д. означают набор данных. Названия файлов 100.csv, 5000000.csv и т.д. хранят информацию о размере набора данных (т.е. количество элементов).
Для запуска контрольных тестов необходимо предварительно сгенерировать или скачать готовый набор тестовых данных.
Из архива нужно будет достать папку join и заменить ею уже существующую папку в dataset/data.
Ссылка на архив с наборами данных
| Название | Описание | Метрики |
|---|---|---|
find_benchmark |
поиск элементов по случайному индексу | время выполнения одного find |
find_multiple_benchmark |
поиск элементов по случайному индексу | время выполнения нескольких find |
join_benchmark |
объединение 2 подмножеств по их элементам | время выполнения одного join |
join_multiple_benchmark |
объединение 2 подмножеств по их элементам | время выполнения нескольких join |
make_set_benchmark |
добавление подмножества из одного элемента в структуру данных | время выполнения одного make_set |
make_set_multiple_benchmark |
добавление подмножеств из одного элемента в структуру данных | время выполнения нескольких make_set |
В IDE выбираете нужный бенчмарк в выпадающем меню в правой верхней части экрана. Затем в том же меню нажимаете на
Edit Configurations. В открывшемся окне заполняете Program arguments. Пишите например 100 10 10. Ниже описание аргументов.
Ну а если хотите вручную...
./benchmark num1 num2 num3- Первый аргумент - количество элементов в структуре данных;
- Второй аргумент - количество наборов данных, на которых проводить тесты;
- Третий аргумент - количество прогонов на наборе данных.
Этот порядок аргументов не для всех бенчмарков. Есть одно исключение - make_set_multiple_benchmark. О нем позже.
Поиск случайного элемента на 10 разных структурах данных размером в 100 элементов (повторить операцию 10 раз на каждом наборе и вычислить среднее время работы одного поиска):
./find_benchmark.exe 100 10 10
Поиск 100 случайных элементов на 10 разных структурах данных размером в 100 элементов (повторить операцию 10 раз на каждом наборе и вычислить среднее время поиска 100 элементов):
./find_multiple_benchmark.exe 100 10 10
Исключение - make_set_multiple_benchmark:
./make_set_multiple_benchmark.exe 100 10
- Первый аргумент - количество элементов в структуре данных, оно же количество вызовов make_set;
- Второй аргумент - количество прогонов;
Список использованных при реализации структуры данных источников.