Изменения

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

Алгоритм LZW

1604 байта добавлено, 22:04, 12 ноября 2014
Примечание
=== Примечание ===
Для повышения степени сжатия изображений данным методом часто используется одна «хитрость» реализации этого алгоритма. Некоторые файлы, подвергаемые сжатию с помощью LZW, имеют часто встречающиеся цепочки одинаковых символов, например <tex>aaaaaa </tex> … или 30, 30, 30 <tex>303030</tex> … и т. п. Их непосредственное сжатие будет генерировать выходной код 0, 0, 5 <tex>005</tex> и т.д. Спрашивается, можно ли в этом частном случае повысить степень сжатия?
Оказывается, это возможно, если оговорить некоторые действия:
*''' '''Если появляется четвертая <tex>a</tex>, то строка <tex>aa?</tex> равна <tex>aaa</tex>, которой нет в словаре. Словарь пополняется этой строкой, а на выход идет метка <5> (<tex>aa</tex>).
*''' '''После этого строка инициализируется третьей <tex>a</tex>, и т.д. и т.п. Дальнейший процесс вполне ясен.
{| class="wikitable" border =1, style="text-align: center; margin-left: auto; margin-right: auto;"
|- bgcolor =#EEEEEE
! scope="col" width="6em" rowspan="2" | Текущая строка
! scope="col" width="6em" rowspan="2" | Текущий символ
! scope="col" width="4em" rowspan="2" | Следующий символ
! colspan="2" | Вывод
! scope="col" width="7em" rowspan="2" colspan="2" | Словарь
|- bgcolor =#EEEEEE
! Код || Биты
|-
| style="text-align: center;" | aa
| style="text-align: center;" | a
| style="text-align: center;" | a
| 0 || 000
| style="border-right: none;" | 5:
| style="border-left: none;" | aa
|-
| style="text-align: center;" | aa
| style="text-align: center;" | a
| style="text-align: center;" | a
| - || -
| style="border-right: none;" | -
| style="border-left: none;" | -
|-
| style="text-align: center;" | aaa
| style="text-align: center;" | a
| style="text-align: center;" | a
| 5 || 101
| style="border-right: none;" | 6:
| style="border-left: none;" | aaa
|-
| style="text-align: center;" | a
| style="text-align: center;" | a
| style="text-align: center;" | a
| - || -
| style="border-right: none;" | -
| style="border-left: none;" | -
|-
| style="text-align: center;" | aa
| style="text-align: center;" | a
| style="text-align: center;" | a
| - || -
| style="border-right: none;" | -
| style="border-left: none;" | -
|-
| style="text-align: center;" | aaa
| style="text-align: center;" | a
| style="text-align: center;" | -
| 6 || 110
| style="border-right: none;" | -
| style="border-left: none;" | -
|}
В результате на выходе получаем последовательность 0, 5, 6 …<tex>056 </tex>..., которая короче прямого кодирования стандартным методом LZW. 
Можно показать, что такая последовательность будет корректно восстановлена. Декодировщик сначала читает первый код – это <0>, которому соответствует символ <tex>a</tex>. Затем читает код <5>, но этого кода в его таблице нет. Но мы уже знаем, что такая ситуация возможна только в том случае, когда добавляемый символ равен первому символу только что считанной последовательности, то есть <tex>a</tex>. Поэтому он добавит в свою таблицу строку <tex>aa</tex> с кодом <5>, а в выходной поток поместит <tex>aa</tex>. И так может быть раскодирована вся цепочка кодов.
Анонимный участник

Навигация