Лабораторная работа 3 Кодирование и декодирование Лемпеля - Зива.
Алгоритм кодирования Лемпеля – Зива LZ77 основан на принципе динамических словарей. Представим вкратце эту концепцию и наглядно поясним ее на простейших примерах. В основе алгоритма лежат четыре основные идеи:
Каждая очередная закодированная последовательность символов добавляется к ранее закодированным символам таким образом, что вместе с ними она образует разложение всей переданной и принятой информации на несовпадающие между собой фразы (Парсинг).
Такое разложение хранится в памяти и используется в дальнейшем в качестве словаря.
Кодирование осуществляется при помощи указателей на фразы из уже сформированного словаря фраз.
Кодирование является динамической процедурой, ориентированной на блоки. Сам процесс кодирования может быть дополнен скользящими окнами, содержащими текущий словарь фраз и Look-ahead буфером.
Рисунок 1 – Скользящее окно алгоритма LZ77, соответствующее фразе FACH.
В процессе кодирования обрабатываемый текст отображается в последовательность указателей или флагов. Структура закодированного текста показана на рисунке 2. В примере, показанном на рисунке 1, цепочка букв «FACH» заменяется последовательностью [21,4,B].
Рисунок 2 – Структура указателей.
Рисунок 3 – Пример кодирования по алгоритму LZ77 с нулевой фразой и
повторением символов.
На рисунке 3 представлен некоторый частный случай и приведено его алгоритмическое решение. На шестом шаге кодирования очередным является символ «Е», не содержащийся в словаре фраз. В этом случае он кодируется посредством, так называемой, «нулевой фразы». «Нулевая фраза» имеет вид [0, 0, символ] и при декодировании распознается по двум стоящим рядом нулям.
Еще одним интересным случаем является повторение символов, так называемое Character Rans. В этом случае, для замены символа используются уже два флага. Первый «0» служит признаком появления некоторой особенности текста. Последующие «1» и символ указывают на то, что символ повторяется. Во втором флаге указывается число повторений и последующий символ.
Затраты на кодирование
определяются длиной окна, содержащего
словарь фраз
,
длиной Look
ahead
буфера
,
и затратами на двоичное
представление указателя
бит.
(1)
Кодирование Лемпеля - Зива приводит к сжатию данных в том случае, если затраты на кодирование, т.е. длина указателя в двоичном исчислении в среднем оказывается меньше, чем при непосредственном кодировании, например, кодом ASCII, что соответствует 8 битам на один символ.
В типичном случае = 212 = 4096 и = 24 = 16 и затраты на двоичное представление указателя составляют 24 бита. Для фразы, состоящей из четырех букв, которая уже содержится в словаре фраз, экономия, но сравнению с прямым кодированием кодом ASCII (32 бита), составляет 25 %.
Для кодирования Лемпеля - Зива установлено, что:
Часто появляющиеся цепочки символов кодируются очень эффективно;
Редко появляющиеся символы и последовательности символов с течением времени удаляются из словаря фраз;
Повторяющиеся символы также кодируются эффективно;
На кодирование нулевых фраз затрачивается относительно большое число бит;
Методы теории информации позволяют доказать, что кодирование методом Лемпеля - Зива асимптотически оптимально. Это означает, что для очень длинного текста избыточность исчезает, то есть среднее число бит, необходимое для кодирования одного символа, стремится к энтропии текста;
Практически достижимая степень сжатия для длинных текстов составляет 50 –60%.
