Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
all of DiskretMat.rtf
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
60.29 Mб
Скачать

4.3. Метод Зива-Лемпеля-Велча (lzw-метод)

4.3.1. Общие положения

При сжатии и раскрытии LZW манипулирует тремя объектами: потоком символов, потоком кодов и таблицей цепочек. При сжатии поток символов является входным и поток кодов - выходным. При раскрытии входным является поток кодов, а поток символов - выходным. Таблица цепочек порождается и при сжатии и при раскрытии, однако она никогда не передается от сжатия к раскрытию и наоборот.

4.3.2. Краткое описание lzw-метода

Пусть на вход подаются символы a, b, c, … (256 различных символов по 8 бит). Идея в том, что часто встречающиеся слова (т.е. последовательности символов) будем хранить в “словаре”.

Алгоритм кодирования (Пример работы алгоритма см. на рис. 7)

Кладем в словарь символы a, b, c, … под номерами 0 .. 255, соответственно.

строка = пустая

пока (поток не пуст) //смотрим входной поток

строка += след.элемент

если (строка есть в словаре) то продолжить;

иначе

// код(строка0) — код, соответствующий строке0 в словаре

вывести код(строка – последний элемент)

добавить_в_словарь(строка)

строка = последний_элемент(строка)

конец если

конец пока

конец алгоритма

Рис.7. Работа кодировщика LZW

Утверждение. По выходной последовательности реконструируется и словарь, и входная последовательность.

Алгоритм декодирования

Кладем в словарь символы a, b, c, … под номерами 0 .. 255, соответственно.

пока (поток не пуст)

код = следующий код из потока

1 если (в словаре есть слово для кода) (рис. 8)

вывести содержимое_словаря(по коду)

добавить в словарь(содерж_словаря(по прошлому_коду) +перв_символ(содерж_словаря(по коду)) )

2 иначе

строка = содерж_словаря(по прошлому_коду) + перв_символ(содерж_словаря(по прошлому_коду))

вывести(строка)

добавить в словарь(строка)

конец если

конец пока

конец алгоритма

Рис. 8. Шаг работы декодировщика LZW в случае 1

Возникают следующие вопросы.

1. Пока в словарь добавили мало слов, на представление кода можно отводить меньше бит: до 512 слов — 9 бит на код, от 512 до 1024 — 10 бит и т.д. Изменение длины кодов должны контролировать и кодировщик, и декодировщик.

2. Если словарь кончится: обнуляем словарь (главное, это должны знать и кодировщик, и декодировщик).

3. Чтобы поиск последовательности в словаре занимал меньше времени можно организовать словарь в виде бинарного дерева поиска.

При сравнительно небольших затратах на одну кодовую комбина­цию получается достаточно большой диапазон номеров, например, при 12 битах (полтора байта) можно закодировать примерно 4000 строк и не требуется никаких дополнительных затрат на таблицу исходных символов.

Важное преимущество LZ-методов и в том, что они адаптивны, т. е. сами приспосабливаются к особенностям текста и не требуют пред­варительного просмотра, как метод Хаффмена. Правда, существуют и адаптивные варианты кодирования по Хаффмену. Эти и другие ме­тоды можно найти в обзорах по сжатию данных, например в [5].

Сейчас массовое использование персональных компьютеров сдела­ло популярными многочисленные "архивирующие программы", среди них наиболее известны arj, zip, zoo, rar, а в среде UNIX — про­граммы compress, gzip, compact. Популярна сжатая система хране­ния информации на диске. В системе программирования JAVA преду­смотрено хранение в сжатой форме исполняемых файлов. Алгоритми­ческую основу архивирующих программ образуют методы Хаффмена и Зива—Лемпеля с различными модификациями и усовершенствовани­ями.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]