Устройство хранения данных типа лента предназначено для последовательной записи и чтения данных. Важные особенности:
- Считывающая/записывающая магнитная головка неподвижна во время чтения и записи.
- Лента может двигаться в обоих направлениях.
- Чтение и запись возможны только в ячейку, на которой находится магнитная головка.
- Перемещение ленты — затратная по времени операция, лента не предназначена для произвольного доступа.
Задача:
Дана входная лента длины N, содержащая элементы типа integer (32 бита). Необходимо отсортировать эти элементы по возрастанию и записать их на выходную ленту той же длины. Однако, есть ограничение на использование оперативной памяти — не более M байт (где M может быть меньше, чем N, так что загрузить все данные с ленты в память невозможно). Для этого можно использовать несколько временных лент для хранения промежуточных данных.
- Определить интерфейс для работы с устройством типа лента.
- Реализовать класс, эмулирующий работу с лентой через обычные файлы:
- Возможность настройки задержек записи/чтения элемента, перемотки и сдвига ленты через внешний конфигурационный файл (например,
config.json). - Временные ленты сохраняются в директорию
temp.
- Возможность настройки задержек записи/чтения элемента, перемотки и сдвига ленты через внешний конфигурационный файл (например,
- Написать класс, реализующий алгоритм сортировки данных с входной ленты на выходную.
- Реализовать консольное приложение, которое:
- Принимает на вход имя входного и выходного файлов.
- Выполняет сортировку данных.
В программе реализован алгоритм MergeSort, который использует 4 временные ленты для хранения промежуточных данных. Для настройки временных задержек операций ленты (чтение, запись, сдвиг) используется конфигурационный файл config.json. Алгоритм написан, как однопоточное приложение, но можно распараллелить на N потоков, но алгоритм используя уже 4*N лент
Консольное приложение принимает следующие параметры:
./TapeSort.exe <input_file> <output_file>Где:
<input_file> — путь к входному файлу с неотсортированными данными. <output_file> — путь к файлу, в который будут записаны отсортированные данные. #Пример
./TapeSort.exe ../data.txt ../output.txtЭто означает, что программа будет обрабатывать около 1024 чисел, копируя их на временные ленты и выполняя сортировку по частям.
###Настройка Конфигурация задержек и параметров работы ленты производится через файл config.json.
{
"read_delay_ms": 100,
"write_delay_ms": 200,
"move_delay_ms": 50
}read_delay_ms — задержка чтения элемента с ленты (в миллисекундах). write_delay_ms — задержка записи элемента на ленту. move_delay_ms — задержка при перемещении ленты на одну позицию.
##Требования Для компиляции и запуска проекта необходимо:
- Компилятор g++
- Библиотека Boost (для работы с JSON-файлами)
##Установка
- Склонируйте репозиторий:
git clone https://github.com/yourusername/tape-sort.git- Перейдите в директорию проекта:
cd TapeSort- Соберите проект:
mkdir build
cd build
cmake ..
cmake --build .- Запустите приложение:
./TapeSort.exe ../data.txt ../out.txt