Изменения

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

Алгоритм LZW

17 байт добавлено, 05:26, 25 октября 2011
Пример
== Пример ==
Данный Рассмотрим пример показывает алгоритм LZW в действии, показывая состояние выходных данных сжатия и словаря на каждой стадиидекодирования изображения.  Первой вещью, как которую мы делаем при кодированииLZW-сжатии, так и при раскодировании сообщенияявляется инициализация нашей цепочки символов. С тем чтобы Чтобы сделать изложение прощеэто, мы ограничимся алфавитом из трех букв.Сообщение, которое нужно сжатьнам необходимо выбрать код размера (количество бит) и знать, выглядит следующим образом:сколько возможных значений ABCABCABCABCABCABC#Маркер '''#''' используется для обозначения конца сообщениямогут принимать наши символы. Тем самымДавайте положим код размера равным 12 битам, что означает возможность запоминания 4096 элементов в нашем алфавите 4 символанашей таблице цепочек. Компьютер представляет это в виде групп битДавайте также предположим, для представления каждого что мы имеем 32 возможных различных символа алфавита нам достаточно группы из 2 бит на символ. По мере роста словаря( Это соответствует, размер групп должен растинапример, картинке с тем чтобы учесть новые элементы. 2-битные группы дают 2<sup>2</sup> = 4 возможные комбинации бит32 возможными цветами для каждого пиксела ) Чтобы инициализировать таблицу, мы установим соответствие кода 0 символу 0, поэтомукода 1 символу 1, когда в словаре появится 5-е словои т.д., алгоритм должен перейти к 3-битным группамдо кода 31 и символа 31. ЗаметимНа самом деле мы указали, чтокаждый код от 0 до 31 является корневым. Больше в таблице не будет других кодов, поскольку используется группа из всех нолей 00, то 5-я группа имеет код '''4'''обладающих этим свойством. Начальный  Изначальный словарь будет содержать:
{| class="wikitable" border = 1, style="text-align: right; margin-left: auto; margin-right: auto;"
|- bgcolor=#EEEEEE
! Символ !! Битовый код !! Номер
|-
| # 0 || 00 || 0
|-
| A 1 || 01 || 1
|-
| B 2 || 10 || 2
|-
| C 3 || 11 |-| .. || ..|-| 31 || 311111
|}
=== Кодирование ===
Без использования алгоритма LZWПусть мы сжимаем последовательность 15, 25, 25, 17, 25, 25, 25. Тогда, согласно изложенному выше алгоритму, мы добавим к изначально пустой строке “15” и проверим, есть ли строка “15” в таблице. Поскольку мы при передаче сообщения как оно есть — 18 символов по 2 бит на каждый — оно займёт инициализации занесли в таблицу все строки из одного символа, то строка “15” есть в таблице. Далее мы читаем следующий символ 25 из входного потока и проверяем, есть ли строка “15, 25” в таблице. Такой строки в таблице пока нет.Добавляем в таблицу <32> “15, 25”. В поток: <15>; “25, 25” — нет. В таблицу: <33> “25, 25”. В поток: <25>; “25, 17” — нет. В таблицу: <34> “25, 17”. В поток: <25>; “17, 25” — нет. В таблицу: <35> “17, 25”. В поток: <17>; “25, 25” — есть в таблице; “25, 25, 25” — нет. В таблицу: <36 бит> “25, 25, 25”. Сравним это с темВ поток: <33>;И, что получается при использовании LZW:наконец последняя строка “25”, за ней идет конец сообщения, поэтому мы просто выводим в поток <25>.
{| class="wikitable" border =1, style="text-align: center; margin-left: auto; margin-right: auto;"
|- bgcolor =#EEEEEE
! Код || Биты
|-
| style="text-align: center;" | NULL
| style="text-align: center;" | A || ||
| style="border-right: none;" |
| style="border-left: none;" | ||
|-
| style="text-align: center;" | A15| style="text-align: center;" | B25| 1 15 || 011111| style="border-right: none;" | 432:| style="border-left: none;" | AB15, 25
| style="text-align: left;" |
|-
| style="text-align: center;" | B25| style="text-align: center;" | C25| 2 25 || 1010111| style="border-right: none;" | 533:| style="border-left: none;" | BC ||25, 25
|-
| style="text-align: center;" | C25| style="text-align: center;" | A17| 3 25 || 1110111| style="border-right: none;" | 634:| style="border-left: none;" | CA ||25, 17
|-
| style="text-align: center;" | AB17| style="text-align: center;" | C25| 4 17 || 10010001| style="border-right: none;" | 735:| style="border-left: none;" | ABC ||17, 25
|-
| style="text-align: center;" | CA25| style="text-align: center;" | B25| 6 - || 110-| style="border-right: none;" | 8:| style="border-left: none;" | CAB ||-
|-
| style="text-align: center;" | BC25| style="text-align: center;" | A25| 5 33 || 101100001| style="border-right: none;" | 936:| style="border-left: none;" | BCA25, 25, 25
| style="text-align: left;" |
|-
| style="text-align: center;" | ABC25| style="text-align: center;" | A| 7 || 111| style="border-right: none;" | 10:| style="border-left: none;" | ABCA|-| style="text-align: center;" | ABCA| style="text-align: center;" | B| 10 || 1010| style="border-right: none;" | 11:| style="border-left: none;" | ABCAB |||-| style="text-align: center;" | BC| style="text-align: center;" | #| 5 25 || 10110111
| style="border-right: none;" |
| style="border-left: none;" |-
| style="text-align: center;" | выводим текущую последовательность
|-
| || || 0 || 000000
| style="border-right: none;" |
| style="border-left: none;" |
|}
Длина закодированного текста = 25 битов.
 
Таким образом, используя LZW мы сократили сообщение на 11 бит из 36 — это почти 30 %. Если сообщение будет длиннее, то элементы словаря будут представлять всё более и более длинные части текста, благодаря чему повторяющиеся слова будут представлены очень компактно.
=== Декодирование ===
84
правки

Навигация