Изменения

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

Алгоритм LZW

2561 байт убрано, 07:05, 25 октября 2011
Пример
| style="text-align: center;" | 25
| style="text-align: center;" | 25
| 25 || 1011111001
| style="border-right: none;" | 33:
| style="border-left: none;" | 25, 25 ||
| style="text-align: center;" | 25
| style="text-align: center;" | 17
| 25 || 1011111001
| style="border-right: none;" | 34:
| style="border-left: none;" | 25, 17 ||
| style="text-align: center;" | 25
| style="text-align: center;" | -
| 25 || 1011111001
| style="border-right: none;" |
| style="border-left: none;" | -
|-
|}
 
Итак, мы получаем закодированное сообщение "15, 25, 25, 17, 33, 25", что на 4 бита короче.
=== Декодирование ===
 Теперь представим ,что мы получили закодированное сообщение, приведённое выше, и нам нужно его декодировать. Прежде всего, нам нужно знать начальный словарь, а последующие записи словаря мы можем реконструировать уже на ходу, поскольку они являются просто конкатенацией предыдущих записей.
! scope="col" width="6em" colspan="2" | Частичная
|-
| 01 1111 || 115| style="text-align: center;" | A15
| style="border-right: none;" |
| style="border-left: none;" |
| style="border-right: none;" | 432:| style="border-left: none;" | A15, ? ||
|-
| 10 11001 || 225| style="text-align: center;" | B25| style="border-right: none;" | 432:| style="border-left: none;" | AB15, 25| style="border-right: none;" | 533:| style="border-left: none;" | B25, ? ||
|-
| 11 11001 || 325| style="text-align: center;" | C25| style="border-right: none;" | 533:| style="border-left: none;" | BC25, 25| style="border-right: none;" | 634:| style="border-left: none;" | C25, ? ||
|-
| 100 10001 || 417| style="text-align: center;" | AB17| style="border-right: none;" | 634:| style="border-left: none;" | CA25, 17| style="border-right: none;" | 735:| style="border-left: none;" | AB17, ? ||
|-
| 110 100001 || 633| style="text-align: center;" | CA
| style="border-right: none;" | 7:
| style="border-left: none;" | ABC
| style="border-left: none;" | ABC?
| style="text-align: left;" |
|-
| 1010 || 10
| style="text-align: center;" | ABCA
| style="border-right: none;" | 10:
| style="border-left: none;" | ABCA
| style="border-right: none;" | 11:
| style="border-left: none;" | ABCA? || Решение проблемы см. ниже
|-
| 101 || 5
| style="text-align: center;" | BC
| style="border-right: none;" | 11:
| style="border-left: none;" | ABCAB
| style="border-right: none;" | 12:
| style="border-left: none;" | BC? ||
|-
| 000000 || 0
| style="text-align: center;" | #
| style="border-right: none;" |
| style="border-left: none;" |
| style="border-right: none;" |
| style="border-left: none;" | ||
|-
|}
 
Единственная небольшая трудность может возникнуть, если новое слово словаря пересылается немедленно. В приведённом выше примере декодирования, когда декодер встречает первый символ, '''ABC?''', он знает, что слово 10 начинается с ABC, но чем оно заканчивается? Проиллюстрируем проблему следующим примером. Мы декодируем сообщение '''ABABA''':
Данные: На выходе: Новая запись:
Полная: Частичная:
.
.
.
011101 = 29 AB 46: (word) 47: AB?
101111 = 47 AB? <--- что нам с этим делать?
 
На первый взгляд, для декодера это неразрешимая ситуация. Мы знаем наперёд, что словом 47 должно быть '''ABA''', но как декодер узнает об этом?
Заметим, что слово 47 состоит из слова 29 плюс символ идущий следующим. Таким образом, слово 47 заканчивается на «символ идущий следующим». Но, поскольку это слово посылается немедленно, то оно должно начинаться с «символа идущего следующим», и поэтому оно заканчивается тем же символом что и начинается, в данном случае — '''A'''. Этот трюк позволяет декодеру определить, что слово 47 это '''ABA'''.
 
В общем случае, такая ситуация появляется, когда кодируется последовательность вида ''cScSc'', где ''c'' — это один символ, а ''S'' — строка, причём слово ''cS'' уже есть в словаре.
== Патенты ==
84
правки

Навигация