Изменения

Перейти к: навигация, поиск

Алгоритм LZW

686 байт добавлено, 00:30, 26 ноября 2014
Примечание
=== Примечание ===
Для повышения степени сжатия изображений данным методом часто используется одна «хитрость» реализации этого алгоритма. Некоторые файлы, подвергаемые сжатию с помощью LZW, имеют часто встречающиеся цепочки одинаковых символов, например <tex>aaaaaaaaaaaaaaaaaaaaa... </tex> или <tex>303030</tex> … и т. п. Их непосредственное сжатие будет генерировать выходной код <tex>005005000600007...</tex> и т.д. Спрашивается, можно ли в этом частном случае повысить степень сжатия?
Оказывается, это возможно, если оговорить некоторые действия:
[[Файл:LZW-img.jpg|right|Работа алгоритма LZW]]
Мы знаем, что для каждого кода надо добавлять в таблицу строку, состоящую из уже присутствующей там строки и символа, с которого начинается следующая строка в потоке.Закодируем сообщение <tex> aaaaaaaaaa </tex>:
*''' ''' Пусть словарь состоит из слов : <tex>a, b, c, d, e</tex>. Будем кодировать стоку <tex>aaaaaaaa</tex>
{| class="wikitable" border = 1, style="float:left; text-align: center; margin-left: 5; margin-right: 10;"
| style="text-align: center;" | aa
| style="text-align: center;" | a
| style="text-align: center;" | a| - || -| 5 style="border-right: none;" |-| 101style="border-left: none;" | - |-| style="text-align: center;" | aaa| style="text-align: center;" | a| style="text-align: center;" | a| - || -
| style="border-right: none;" | -
| style="border-left: none;" | -
|-
| style="text-align: center;" | aaaa
| style="text-align: center;" | a
| style="text-align: center;" | a
| 7 || 111
| style="border-right: none;" | 8:
| style="border-left: none;" | aaaaa
|}
В результате на выходе получаем последовательность <tex>05650567</tex>.При кодирование использовались только трехбитные группы..Длина закодированного сообщения составила <tex> 4 \cdot 3 = 12 </tex> бит, которая что на <tex> 7 \cdot 3 - 12 = 9</tex> бит короче прямого кодирования стандартным методом LZW. 
Можно показать, что такая последовательность будет корректно восстановлена. Декодировщик сначала читает первый код – это <tex>\langle0\rangle</tex>, которому соответствует символ <tex>a</tex>. Затем читает код <tex>\langle5\rangle</tex>, но этого кода в его таблице нет. Но мы уже знаем, что такая ситуация возможна только в том случае, когда добавляемый символ равен первому символу только что считанной последовательности, то есть <tex>a</tex>. Поэтому он добавит в свою таблицу строку <tex>aa</tex> с кодом <tex>\langle5\rangle</tex>, а в выходной поток поместит <tex>aa</tex>. И так может быть раскодирована вся цепочка кодов.
Анонимный участник

Навигация