| bin | ||
| include/tapelib | ||
| src | ||
| tests | ||
| .clang-format | ||
| .clang-tidy | ||
| .gitignore | ||
| .pre-commit-config.yaml | ||
| CMakeLists.txt | ||
| README.md | ||
Yadro TATLIN Data Services - Задание
Устройство хранения данных типа лента (Tape) предназначено для последовательной записи и чтения
данных. Считывающая/записывающая магнитная головка неподвижна во время чтения и записи, а лента имеет возможность двигаться в обоих направлениях. Запись и чтение информации возможны в ячейку ленты, на которой в данный момент находится магнитная головка. Перемещения ленты – затратная по времени операция – лента не предназначена для произвольного доступа. Имеется входная лента длины N (где N – велико), содержащая элементы типа integer (2^32). Имеется выходная лента такой же длины. Необходимо записать в выходную ленту отсортированные по возрастанию элементы с входной ленты. Есть ограничение по использованию оперативной памяти – не более M байт (M может быть < N, т.е. загрузить все данные с ленты в оперативную память не получится). Для реализации алгоритма можно использовать разумное количество временных лент, т.е. лент, на которых можно хранить какую-то временную информацию, необходимую в процессе работы алгоритма.
Необходимо создать проект С++, компилируемый в консольное приложение, которое реализует алгоритм сортировки данных с входной ленты на выходную. Необходимо сделать следующее:
- Определить интерфейс для работы с устройством типа лента.
- Написать класс, реализующий этот интерфейс и эмулирующий работу с лентой посредством обычного файла. Должно быть возможно сконфигурировать (без перекомпиляции – например, через внешний конфигурационный файл, который будет прочитан на старте приложения) задержки по записи/чтению элемента с ленты, перемотки ленты, и сдвига ленты на одну позицию.
- Файлы временных лент можно сохранять в директорию
tmp. - Написать класс, реализующий алгоритм сортировки данных с входной ленты на выходную.
- Консольное приложение должно принимать на вход имя входного и выходного файлов и производить сортировку.
- Желательно написать юнит-тесты.
Описание
Проект использует CMake для сборки. Некоторый функционал проекта несовместим с Windows и MacOS (получение используемой памяти, создание временных файлов и т. п.) Проект успешно собирался на Linux x86_64 и aarch64. Документация реализована посредством этого README файла, а также подробными комментариями в коде
Структура проекта:
bin- Исходный код исполняемых файловftsort- Исходный код основной программы проекта
include- Директория для заголовковtapelib- Директория для заголовков библиотекиtapelib
src- Исходный код библиотекtests- Исходный код unit-тестов
Сборка
Linux
- Склонируйте данный репозиторий и перейдите в него
git clone https://git.obamna.ru/erius/yadro-task.git
cd yadro-task
- Сгенерируйте файлы сборки CMake
cmake -S . -B build
- Соберите проект с помощью CMake
cmake --build build
Список CMake целей, которые можно собрать:
tapelib- Библиотекаtapelib, в которой определены структуры данных и алгоритм сортировкиfiletape_tests- Unit-тесты, проверяющие работоспособность классаFileTapefiletape_sort_tests- Unit-тесты, проверяющие корректность работы алгоритма сортировкиFileTape- Unit-тесты можно запустить следующей командой:
ctest --test-dir build -Vftsort- Исполняемый файлftsort, производящий сортировкуFileTape- Отсортировать
input.txtв файлoutput.txtс максимально разрешенным числом ячеек в памяти программы 100, и с задержкой операции чтения изFileTapeв 1 мс, можно следюущей командой:
./build/bin/ftsort input.txt output.txt -m 100 -r 1- Получить подробную инструкцию для
ftsortможно следующей командой:
./build/bin/ftsort --help- Отсортировать
generate_input- Исполняемый файлgenerate_input, генерирующий файл дляFileTape, заполненный ячейками со случайными значениями- Сгенерировать файл
input.txtдляFileTape, состоящий из 1000 ячеек со случайными значениями, можно следующей командой:
./build/tests/generate_input input.txt 1000- Сгенерировать файл
Сборка и работоспособность проекта не проверялись на Windows и MacOS