
Теоретические данные
Основные сведения
Архиватор – это программный продукт позволяющий изменять путем сжатия размер архива. Создание архива происходит путём сжатия данных.
Сжатие – это процесс перекодирования информации, в результате которого уменьшается объем файла. Сжатие бывает без потерь («lossless compression») и с потерями («lossy compression»). В случае сжатия данных без потерь, восстановление файла из архива происходит без изменения качества первоначального файла, во втором – с небольшими потерями качества. Самым простым видом сжатия без потерь является метод под названием «running», подсчитывающий количество последовательных, «идущих друг за другом» повторов. Но этот метод уже недостаточен в случае наличия повторов, встречающихся в разных местах текста.
Развитие программ – архиваторов позволило добиться не только сжатия без потерь, но также возможности создания многотомных архивов и архивов в различных форматах. Архивы бывают сложной структуры, то есть многотомными. Кроме того, они бывают самораспаковывающимися, то есть процесс извлечения файла в данном случае происходит автоматически. Самораспаковывающиеся архивы имеют, как правило, расширение.exe и называются SFX-архивами (от слова «self-extracting»). Архивы также бывают «непрерывными» («solid»). Непрерывный архив – это архив в формате RAR, упакованный таким образом, что все его файлы представляют непрерывный поток информации. Непрерывная архивация применяется только для формата RAR, для ZIP она недоступна. Плюсом непрерывной архивации является увеличение такого параметра компрессии как степень сжатия, минусом является увеличение параметра скорости расжатия, то есть непрерывный архив будет распаковываться гораздо медленнее. Кроме того, процессы добавления в исходный архив файла или наоборот удаления имеющегося файла будут также происходить медленнее.
Методы сжатия
В основе всех методов сжатия лежит простая идея: если представлять часто используемые элементы короткими кодами, а редко используемые - длинными кодами, то для хранения блока данных требуется меньший объем памяти, чем если бы все элементы представлялись кодами одинаковой длины.
Методы сжатия файлов бывают «открытыми» и «коммерческими». В первом случае алгоритм можно свободно исследовать и использовать, так как он сам по себе является ценностью. Во втором случае использование метода является закрытым: алгоритм засекречивается в виду того, что он применяется только в отдельных программных продуктах.
В настоящее время существует очень много алгоритмов сжатия данных без потерь, наиболее распространенными являются такие как: Lossless JPEG, алгоритм Хаффмана, алгоритмы группы KWE:
1) алгоритм LZ (Лемпеля-Зива);
2) алгоритм LZW (Лемпеля-Зива-Велча).
1.2.1 Алгоритмы группы KWE
Существует довольно много реализаций этого алгоритма, среди которых наиболее распространенными являются алгоритм Лемпеля-Зива (алгоритм LZ) и его модификация алгоритм Лемпеля-Зива-Велча (алгоритм LZW).Для алгоритма LZ основан на создании своеобразного словаря, где каждое слово получает свой порядковый номер, и в результате сжатый файл содержит не предложения, а последовательность чисел, что существенно сокращает его размер. Алгоритм начинает работу с почти пустым словарем, что содержит только одну закодированную строку, так называемая NULL-строка. Когда происходит считывание очередного символа входной последовательности данных, то он прибавляется к текущей строке. Это будет продолжаться до тех пор, пока текущая строка соответствует какой-нибудь фразе из словаря. В момент, когда текущая строка представляет собой последнее совпадение со словарем плюс только что прочитанный символ сообщения, кодер выдает код, который состоит из индекса совпадения и следующего за ним символа, который нарушил совпадение строк, а новая фраза, состоящая из совпадающего индекса и следующего за ним символа - записывается в словарь. Если эта фраза появляется еще раз, то она может быть использована для построения более длинной фразы. Это способствует повышению сжатия информации.
Семейство LZ-подобных алгоритмов могут различаться, например, методом поиска повторяющихся цепочек.
1.2.2 Lossless JPEG
Этот алгоритм разработан группой экспертов в области фотографии (Joint Photographic Expert Group). В отличие от JBIG, Lossless JPEG ориентирован на полноцветные 24-битные или 8-битные в градациях серого изображения без палитры. Коэффициенты сжатия: 20, 2, 1. Lossless JPEG рекомендуется применять в тех приложениях, где необходимо побитовое соответствие исходного и декомпрессированного изображений.
Этот формат разрабатывался, прежде всего, для хранения изображений в медицинских целях, то есть для тех случаев, когда важно иметь большое изображение без малейших потерь качества.
Сжатие Хаффмана
Сжатие Хаффмана - статистический метод сжатия, который уменьшает среднюю длину кодового слова для символов алфавита. Код Хаффмана является примером кода, оптимального в случае, когда все вероятности появления символов в сообщении - целые отрицательные степени двойки.
Алгоритм Хаффмана основывается на том, что символы в текстах как правило встречаются с различной частотой.
При обычном кодировании каждый символ записывается в фиксированном количестве бит, например каждый символ в одном байте, или в двух.
Однако, т. к. некоторые символы встречаются чаще, а некоторые реже − можно записать часто встречающиеся символы в небольшом количестве бит, а для редко встречающихся символов использовать более длинные коды. Тогда суммарная длина закодированного текста может стать меньше.
1.2.3.1 Виды алгоритма Хаффмана
Существуют следующие виды алгоритма Хаффмана:
1) статический;
2) динамический;
3) адаптивный.
Статический алгоритм отличается от него тем, что таблица частот не вычисляется по тексту, а используется некоторая ранее вычисленная таблица. Соответственно, для динамического алгоритма требуется два прохода по тексту, первый для построения таблицы, второй − для кодирования. Для статического алгоритма требуется только один проход, т. к. таблица уже есть.
Естественно, при использовании статического алгоритма возникает риск того, что алгоритм будет не эффективен из-за несоответствия реальных частот и значений в таблице.
В адаптивном алгоритме используется один проход, но при этом дерево постоянно перестраивается, т. е. меняются коды символов.
1.2.3.2 Алгоритм Хаффмана
Алгоритм построения кодов Хаффмана:
1) символы входного алфавита образуют список свободных узлов, каждый лист имеет вес, который равен частоте появления символа;
2) выбираются два свободных узла дерева с наименьшими весами;
3) создается их родитель с весом, равным их суммарному весу;
4) родитель добавляется в список свободных узлов, а двое его детей удаляются из этого списка;
5) одной дуге, выходящей из родителя, ставится в соответствие бит 1, другой — бит 0;
6) шаги, начиная со второго, повторяются до тех пор, пока в списке свободных узлов не останется только один свободный узел. Он и будет считаться корнем дерева.
1.2.3.3 Декодирование
Для декодирования можно воспользоваться построенным деревом.
В цикле выполняются следующие действия:
1) в зависимости от значения бита, выполняется проход по дереву по дуге, на которой указано такое же значение;
2) при попадании в лист дерева: считывается символ, находящийся в данном листе и записывается в результат декодирования, выполняется переход в корень дерева.
1.2.3.4 Передача закодированного текста
При передаче закодированных данных требуется передавать дерево или таблицу частот для возможности восстановления дерева.
Чтобы передавать таблицу частот, необходимо всегда помечать левую дугу 1, а правую 0 (или наоборот), чтобы можно было восстановить дерево по таблице.