Напишите программу, выполняющую сжатие двухпроходным алгоритмом Хаффмана.
-
Ограничения.
- Наибольший размер входного файла — 5MB.
- Ограничение на время выполнения — 5 секунд.
-
Требования к реализации.
- Реализация должна быть выполнена в объектно-ориентированном стиле (например, включать классы
TreeNode,HuffTree,HuffmanArchiver). - Для хранения элементов, там, где это уместно, должна быть использована библиотека STL (например,
std::vector, а не динамический массив). - Ввод-вывод должен быть выполнен с помощью классов STL (
iostream). - Должны использоваться исключения.
- Должен быть реализован свой класс для автоматического тестирования или использована одна из библиотек (
google test,doctest, etc). - Для методов должны быть написаны автотесты.
- Действуют все стандартные требования.
- Реализация должна быть выполнена в объектно-ориентированном стиле (например, включать классы
-
Примечания.
- Рекомендуем удостовериться, что сжатый, а затем разжатый Вами файл эквивалентен исходному.
- Рекомендуем протестировать на больших файлах, файлах разного типа (текстовые, бинарные) и на пустом файле.
- Рекомендуем проверить свою программу на синтетических тестах, заведомо плохо кодируемых алгоритмом Хаффмана.
- Рекомендуем проверить свою программу на утечки памяти
-
Параметры командной строки. Значение параметра (если есть) указывается через пробел. Программа должна проверять корректность параметров и выводить сообщение об ошибке.
-c: архивирование-u: разархивирование-f,--file <путь>: имя входного файла-o,--output <путь>: имя результирующего файла
-
Вывод на экран. Программа должна выводить на экран статистику сжатия/распаковки: размер исходных данных, размер полученных данных и размер, который был использован для хранения вспомогательных данных в выходном файле (например, таблицы). Не должно выводиться никакого дополнительного текста, только размеры. Все размеры в байтах.
Например:
$ ./huffman -c -f myfile.txt -o result.bin 15678 6172 482Размер исходного файла (исходные данные): 15678 байт, размер сжатых данных (без дополнительной информации): 6172 байта, размер дополнительных данных: 482 байта. Размер всего сжатого файла: 6172 + 482 = 6654 байта.
$ ./huffman -u -f result.bin -o myfile_new.txt 6172 15678 482Размер распакованного файла (полученные данные): 15678 байт, размер сжатых данных (без дополнительной информации): 6172 байта, размер дополнительных данных: 482 байта. Размер всего исходного сжатого файла: 6172 + 482 = 6654 байта.
-
Формат сдачи. В директории
hw_02в репозитории должны быть: директорияsrc, директорияtest,Makefile.-
Директория
src:main.cpp,huffman.h,huffman.cpp -
Директория
test:test.cpp(точка входа),autotest.h,autotest.cpp(реализация класса-родителя тестов),huffman_test.h,huffman_test.cpp(собственно тесты). -
Makefile:- цель по умолчанию собирает исполняемый файл
hw_02и объектные файлы в директориюobj(создается при сборке, если не существует) - цель
testсобирает исполняемый файлhw_02_testи объектные файлы в директориюobj - цель
cleanочищает директориюobj
- цель по умолчанию собирает исполняемый файл
-
На выполнение задачи дается три недели и три попытки. Раз в неделю присланные решения будут проверяться. Дедлайны:
- 21 апреля 2021, 22:59 МСК,
- 28 апреля 2021, 22:59 МСК,
- 12 мая 2021, 22:59 МСК.
-