Алгоритм LZW
Непосредственным предшественником алгоритма LZW явился алгоритм LZ78, опубликованный в 1978 г. Этот алгоритм воспринимался как математическая абстракция до 1984 г., когда Терри Уэлч (Terry A. Welch) опубликовал свою работу с модифицированным алгоритмом, получившим в дальнейшем название LZW (Lempel-Ziv-Welch).
Алгоритм LZW построен вокруг так называемой таблицы фраз (словаря), которая отображает строки символов сжимаемого сообщения в коды фиксированной длины, равные 12 бит. Таблица обладает свойством предшествования, то есть для каждой фразы словаря, состоящей из некоторой фразы w и символа К, фраза w тоже содержится в словаре.
Пример работы кодера LZW при преобразовании трехсимвольного алфавита приведен в табл. 8.6 и 8.7.
Описанный алгоритм кодера не оптимизирует выбор фразы для добавления в словарь или разбор сообщения. Однако в силу его простоты он может быть эффективно использован.
Таблица 8.6. Работа кодера LZW на примере трехсимвольного алфавита (а, б, в)
Символ | wK | Выход | Добавление в словарь (фраза — позиция) |
а | 1 | ||
6 | 6 | 1 | 16(4) |
а | 2а | 2 | 2а(5) |
6 | 16 | ||
в | 4в | 4 | 4в(6) |
б | 36 | 3 | 36(7) |
а | 2а | ||
6 | 56 | 5 | 56(8) |
а | 2а | ||
6 | 56 | ||
а | 8а | 8 | 8а(9) |
а | 1а | 1 | 1а(10) |
а | 1a | ||
а | 10a | 10 | 10a (11) |
а | 1a | ||
а | 10a | '• | |
а | 11a | 11 | 11a (12) |
1 |
Декодер LZW должен использовать тот же словарь, что и кодер, строя его по аналогичным правилам при восстановлении сжатых данных. Каждый считываемый код разбирается с помощью словаря на предшествующую фразу w и символ К. Затем рекурсия продолжается для предшествующей фразы w до тех пор, пока она не окажется кодом одного символа.
Таблица 8.7. Словарь, построенный кодером LZW, для примера из табл. 8.6
Фразы, добавленные в словарь при инициализации | |
а | 1 |
6 | 2 |
в | 3 |
Фразы, добавленные пр | и разборе сообщения |
16 | 4 |
2а | 5 |
4в | 6 |
36 | 7 |
56 | 8 |
8а | 9 |
la | 10 |
10a | 11 |
11a | 12 |
При этом завершается декомпрессия этого кода. Обновление словаря происходит для каждого декодируемого кода, кроме первого. После завершения декодирования кода его последний символ, соединенный с предыдущей фразой, добавляется в словарь. Новая фраза получает то же значение кода (позицию в словаре), что присвоил ей кодер. В результате такого процесса, шаг за шагом декодер восстанавливает тот словарь, который построил кодер.