Описание алгоритма сжатия LZW


Лекция 13

В методе сжатия LZW используется начальный словарь ВСЕХ различных символов кодируемого текста. Он может строиться путем анализа всего текста. Но чаще в качестве начального словаря используется готовая и всем известная стандартная табличка символов ASCII+.

Процесс сжатия выглядит следующим образом.

-Последовательно считываются символы входной последовательности и происходит проверка, существует ли в созданной таблице строк (в словаре) такая строка.

-Если такая строка существует, считывается следующий символ,

-а если строка не существует, то в выходную последовательность заносится код для предыдущей найденной строки, сама строка заносится в таблицу словаря, и поиск начинается с текущего символа.

Например, если сжимают байтовые данные (текст), то строк в начальной таблице (ASCII+) словаре окажется 256 (от «0» до «255»). Если используется 10-битный код, то под коды для новых строк остаются значения в диапазоне от 256 до 1023. Новые строки формируют таблицу последовательно, т. е. можно считать индекс строки ее кодом.

Алгоритму декодирования на входе требуется только закодированный текст, поскольку он может воссоздать соответствующую таблицу преобразования непосредственно по закодированному тексту. Алгоритм декодирования генерирует однозначно декодируемый код за счет того, что каждый раз, когда генерируется новый код, новая строка добавляется также и в начальную таблицу строк (в словарь). LZW постоянно проверяет, является ли строка уже известной в словаре, и, если так, выводит существующий код для этой подстроки. Таким образом, каждая строка будет храниться в единственном экземпляре и иметь свой уникальный номер. Следовательно, при восстановлении сообщения при получении нового кода в восстанавливаемый словарь добавляется новая строка, а при получении уже известного, строка извлекается из словаря.

В общем по описанию процесса сжатия понять работу алгоритма не очень легко, поэтому рассмотрим пример сжатия и декодирования сообщения.

Пример 13.1Сжимаем текст "abacabadabacabae"

Сначала создадим начальный словарь единичных символов. В стандартной кодировке ASCII имеется 256 различных символов, поэтому начальный размер кода для кодирования одного символа будет равен 8 битам. Если нам заранее известно, что в исходном файле будет меньшее количество различных символов, то вполне разумно уменьшить количество бит для кодирования символа.

Чтобы инициализировать таблицу, мы установим соответствие кода 0 соответствующему символу с байтом 00000000, тогда 1 соответствует символу с байтом 00000001, 7 –соответствует 00000111 и т.д., до кода 255.

По мере роста словаря, размер групп должен расти, с тем, чтобы учесть новые элементы. 8-битные группы дают 256 возможных комбинации бит, поэтому, когда в словаре появится 256-е слово, алгоритм должен перейти к 9-битным группам. При появлении 512-ого слова произойдет переход к 10-битным группам, что дает возможность запоминать уже 1024 слова и т.д.

В нашем примере алгоритму заранее известно о том, что будет использоваться всего 5 различных символов,следовательно, для их хранения будет использоваться минимальное количество бит, позволяющее нам их запомнить, то есть 3шт. ( 8 различных комбинаций ).