- •Введение
- •Общие характеристики алгоритмов архивации
- •Алгоритмы сжатия данных Сжатие способом кодирования серий (rle)
- •Алгоритм Хаффмана
- •Арифметическое кодирование
- •Алгоритм Лемпеля-Зива-Велча (Lempel-Ziv-Welch - lzw)
- •Двухступенчатое кодирование. Алгоритм Лемпеля-Зива
- •Перечень программ сжатия с кратким указанием алгоритмов их работы
- •Заключение
- •Использованные источники
- •Архиваторы как средство антивирусной защиты
Арифметическое кодирование
Совершенно иное решение предлагает т.н. арифметическое кодирование. Арифметическое кодирование является методом, позволяющим упаковывать символы входного алфавита без потерь при условии, что известно распределение частот этих символов и является наиболее оптимальным, т.к. достигается теоретическая граница степени сжатия.
Предполагаемая требуемая последовательность символов, при сжатии методом арифметического кодирования рассматривается как некоторая двоичная дробь из интервала [0, 1). Результат сжатия представляется как последовательность двоичных цифр из записи этой дроби.
Идея метода состоит в следующем: исходный текст рассматривается как запись этой дроби, где каждый входной символ является "цифрой" с весом, пропорциональным вероятности его появления. Этим объясняется интервал, соответствующий минимальной и максимальной вероятностям появления символа в потоке.
Пример:
Пусть алфавит состоит из двух символов: a и b с вероятностями соответственно 0,75 и 0,25.
Рассмотрим наш интервал вероятностей [0, 1). Разобьем его на части, длина которых пропорциональна вероятностям символов. В нашем случае это [0; 0,75) и [0,75; 1). Суть алгоритма в следующем: каждому слову во входном алфавите соответствует некоторый подинтервал из интервала [0, 1) а пустому слову соответствует весь интервал [0, 1). После получения каждого следующего символа интервал уменьшается с выбором той его части, которая соответствует новому символу. Кодом цепочки является интервал, выделенный после обработки всех ее символов, точнее, двоичная запись любой точки из этого интервала, а длина полученного интервала пропорциональна вероятности появления кодируемой цепочки.
Применим данный алгоритм для цепочки "aaba":

Границы интервала вычисляются так берется расстояние внутри интервала (0,5625-0,421875=0,140625), делится на частоты [0; 0,10546875) и [0,10546875; 1) и находятся новые границы [0,421875; 0,52734375) и [0,52734375; 0,5625).
В качестве кода можно взять любое число из интервала, полученного на шаге 4, например, 0,43.
Алгоритм декодирования работает аналогично кодирующему. На входе 0,43 и идет разбиение интервала.
Продолжая этот процесс, мы однозначно декодируем все четыре символа. Для того, чтобы декодирующий алгоритм мог определить конец цепочки, мы можем либо передавать ее длину отдельно, либо добавить к алфавиту дополнительный уникальный символ - "конец цепочки".
Алгоритм Лемпеля-Зива-Велча (Lempel-Ziv-Welch - lzw)
Данный алгоритм отличают высокая скорость работы как при упаковке, так и при распаковке, достаточно скромные требования к памяти и простая аппаратная реализация.
Недостаток - низкая степень сжатия по сравнению со схемой двухступенчатого кодирования.
Предположим, что у нас имеется словарь, хранящий строки текста и содержащий порядка от 2-х до 8-ми тысяч пронумерованных гнезд. Запишем в первые 256 гнезд строки, состоящие из одного символа, номер которого равен номеру гнезда.
Алгоритм просматривает входной поток, разбивая его на подстроки и добавляя новые гнезда в конец словаря. Прочитаем несколько символов в строку s и найдем в словаре строку t - самый длинный префикс s.
Пусть он найден в гнезде с номером n. Выведем число n в выходной поток, переместим указатель входного потока на length(t) символов вперед и добавим в словарь новое гнездо, содержащее строку t+c, где с - очередной символ на входе (сразу после t). Алгоритм преобразует поток символов на входе в поток индексов ячеек словаря на выходе.
При практической реализации этого алгоритма следует учесть, что любое гнездо словаря, кроме самых первых, содержащих одно-символьные цепочки, хранит копию некоторого другого гнезда, к которой в конец приписан один символ. Вследствие этого можно обойтись простой списочной структурой с одной связью.
Пример: ABCABCABCABCABCABC - 1 2 3 4 6 5 7 7 7
|
1 |
A |
|
2 |
B |
|
3 |
C |
|
4 |
AB |
|
5 |
BC |
|
6 |
CA |
|
7 |
ABC |
|
8 |
CAB |
|
9 |
BCA |
