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

4.1.3. Пример использования метода Хаффмена.

Исходный текст (223 знака, прописные буквы для простоты за­менены строчными, знаки препинания и переводы строк удалены, межсловный пробел заменен подчеркиванием, в каждой строке по 50 символов):

ехали_меаведи_на_велосипеде_а_за_ними_кот_задом_на

перед_а_за_ним_комарики_на_воздушном_шарике_а_за_н

ими_раки_на_хромой_собаке_волки_на_кобыле_львы_в_а

втомобиле_зайчики_в_трамвайчике_жаба_на_метле_едут

_и_смеются_пряники_жуют

По этому тексту получаем следующую статистику:

е17 х2 а24 л7 и20 _40 м12 д7 в9

н11 о13 с4 п3 з6 к11 т7 р7 у3

ш2 й3 б4 ы2 ь1 ч2 ж2 ю2 я2

или после сортировки по убыванию частот

_40 а24 и20 е17 о13 м12 н11 к11 в9

л7 д7 т7 р7 з6 с4 б4 пЗ йЗ

у3 х2 ш2 ы2 ч2 ж2 ю2 я2 ь1

Кодовые последовательности после применения алгоритма Хаффмена:

_ 111 а 010 и 000 е 1100 о 1000 м 0110 и 0010 к 0011 в 11010 л 10100 д 10101 т 10010 р 10011 з 110110 с 101100 б 101101 п 011110 и 011100 у 011101 х 1101110 ш 1101111 ы 1011110 ч 1011111 ж 1011100 ю 1011101 я 0111110 ь 0111111

Применяя эти кодовые последовательности для кодирования текста, получаем такой двоичный текст (длина строки — 64 бита):

110011011100101010000011101101100101011101011001010100011100100101111101011001010010001011000000111101100101011100111010111110110010111001000001100001110011100010010111110110010101011000011011100100100111101100100111100101011110101111101100101110010000011011100111000011001010011000001100011100100101111101010001101101010101110111011110010100001101111101111010100110000011110011101011111011001011100100000110000111100110100011000111001001011111011101001110000110100001110011110110010001011010100011110011111010100010100001100011100100101110011100010110110111101010011001111010001111111101010111101111101011101011010100101000011010001011010001010011001111101100100111001011111000001100011111010111100101001101001101101001001110010111110000011110011110111000101011010101110010010111011011001001010100110011111001010101110110010111000111101100011011001011101100101011000111110111011110100110111110001000000110001111011100011101101110110010

Получилось немного меньше 119 байтов, так что исходный текст сокращен почти вдвое (правда, если не считать самой кодовой таблицы)

По методу Хаффмена получается максимальное сжатие, и, казалось бы, ни о каком дальнейшем улучшении уже не может быть и речи. Вспомним, однако, что минимизируется математическое ожидание по­следовательности независимых символов, — код Хаффмена никак не использует информацию о закономерностях чередования символов в кодируемом тексте, закономерностях сложных и плохо описываемых математическими моделями.

4.2. Метод Зива Лемпеля (lz-метод)

4.2.1. Основные определения

"Символ": фундаментальный элемент данных. В обычных текстовых файлах это отдельный байт. В растровых изображениях это индекс, который указывает цвет данного пиксела. Будем ссылаться на произвольный символ как на "K".

"Поток символов": поток символов такой, как файл данных.

"Цепочка": несколько последовательных символов. Длина цепочки может изменяться от 1 до очень большого числа символов. Будем указывать произвольную цепочку как "[...]K".

"Префикс": почти то же самое, что цепочка, но подразумевается, что префикс непосредственно предшествует символу, и префикс может иметь нулевую длину. Будем ссылаться на произвольный префикс, как на "[...]".

"Корень": односимвольная цепочка. Для большинства целей это просто символ, но иногда это может быть иначе. Это [...]K, где [...] пуста.

"Код": число, определяемое известным количеством бит, которое кодирует цепочку.

"Поток кодов": выходной поток кодов, таких как "растровые данные".

"Элемент": код и его цепочка.

"Таблица цепочек": список элементов обычно, но не обязательно, уникальных.

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