Изменения

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

Алгоритм LZW

693 байта убрано, 02:54, 4 ноября 2010
Пример
== Пример ==
Данный пример показывает алгоритм LZW в действии, показывая состояние выходных данных и словаря на каждой стадии, как при кодировании, так и при раскодировании сообщения. С тем чтобы сделать изложение проще, мы ограничимся простым алфавитом — только заглавные буквы, без знаков препинания и пробеловалфавитом из трех букв.
Сообщение, которое нужно сжать, выглядит следующим образом:
TOBEORNOTTOBEORTOBEORNOTABCABCABCABCABCABC#Маркер '''#''' используется для обозначения конца сообщения. Тем самым, в нашем алфавите 27 символов (26 заглавных букв от A до Z и #)4 символа. Компьютер представляет это в виде групп бит, для представления каждого символа алфавита нам достаточно группы из 5 бит 2 бит на символ. По мере роста словаря, размер групп должен расти, с тем чтобы учесть новые элементы. 52-битные группы дают 2<sup>52</sup> = 32 возможных 4 возможные комбинации бит, поэтому, когда в словаре появится 335-е слово, алгоритм должен перейти к 63-битным группам. Заметим, что, поскольку используется группа из всех нолей 0000000, то 335-я группа имеет код '''324'''. Начальный словарь будет содержать:
{| class="wikitable" border = 1, style="text-align: right; margin-left: auto; margin-right: auto;"
! Символ !! Битовый код !! Номер
|-
| # || 00000 00 || 0
|-
| A || 00001 01 || 1
|-
| B || 00010 10 || 2|-| C || 00011 || 3|-| D || 00100 || 4|-| E || 00101 || 5|-| F || 00110 || 6|-| G || 00111 || 7|-| H || 01000 || 8|-| I || 01001 || 9|-| J || 01010 || 10|-| K || 01011 || 11|-| L || 01100 || 12|-| M || 01101 || 13|-| N || 01110 || 14|-| O || 01111 || 15|-| P || 10000 || 16|-| Q || 10001 || 17|-| R || 10010 || 18|-| S || 10011 || 19|-| T || 10100 || 20|-| U || 10101 || 21|-| V || 10110 || 22|-| W || 10111 || 23|-| X || 11000 || 24|-| Y || 11001 || 25|-| Z || 11010 || 26
|-
| C || 11 || 3
|}
|-
| style="text-align: center;" | NULL
| style="text-align: center;" | T A || ||
| style="border-right: none;" |
| style="border-left: none;" | ||
|-
| style="text-align: center;" | TA| style="text-align: center;" | OB
| 20 || 10100
| style="border-right: none;" | 275:| style="border-left: none;" | TOAB
| style="text-align: left;" |
|-
| style="text-align: center;" | O
| style="text-align: center;" | B
| style="text-align: center;" | C
| 15 || 01111
| style="border-right: none;" | 286:| style="border-left: none;" | OB BC ||
|-
| style="text-align: center;" | BC| style="text-align: center;" | EA
| 2 || 00010
| style="border-right: none;" | 297:| style="border-left: none;" | BE CA ||
|-
| style="text-align: center;" | EAB| style="text-align: center;" | OC
| 5 || 00101
| style="border-right: none;" | 308:| style="border-left: none;" | EO ABC ||
|-
| style="text-align: center;" | OCA| style="text-align: center;" | RB
| 15 || 01111
| style="border-right: none;" | 319:| style="border-left: none;" | OR CAB ||
|-
| style="text-align: center;" | R
55
правок

Навигация