Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
40_алгоритмов_Python.pdf
Скачиваний:
9
Добавлен:
07.04.2024
Размер:
13.02 Mб
Скачать

300

Глава 11. Алгоритмы обработки данных

zz Умная маршрутизация заказов.

zz Дашборды для мониторинга в реальном времени. zz Датчики движения на автомагистралях.

zz Операции с кредитными картами.

zz Действия игроков в многопользовательских онлайн-играх.

АЛГОРИТМЫ СЖАТИЯ ДАННЫХ

Алгоритмы сжатия данных обеспечивают уменьшение размера данных.

В этой главе представлен конкретный тип алгоритмов сжатия данных — алгоритмы сжатия без потерь (lossless compression algorithms).

Алгоритмы сжатия без потерь

Это алгоритмы, способные сжимать данные таким образом, чтобы в дальнейшем их можно было распаковать без какой-либо потери информации. Они исполь­ зуются, если после распаковки важно получить точные исходные файлы. Ти­ пичные случаи применения:

zz Сжатие документов.

zz Сжатие и упаковка исходного кода и исполняемых файлов.

zz Преобразование большого количества небольших файлов в небольшое ко­ личество больших файлов.

Основные методы сжатия без потерь

Сжатие данных основано на принципе, согласно которому данные часто ис­ пользуют больше битов, чем необходимо (согласно энтропии данных). Напом­ ним, что понятие энтропии используется для определения информативности данных. Это означает, что возможно более эффективное битовое представление одной и той же информации. Поиск и формулирование оптимального битового представления — основа разработки алгоритмов сжатия. Методы сжатия без потерь используют избыточность данных. В конце 80-х годов Зив и Лемпель предложили такие методы на основе словарей. Эти алгоритмы мгновенно об­ рели успех из-за своей скорости и хорошей степени сжатия. Они были исполь­ зованы для создания некогда популярной утилиты compress на базе Unix. Кроме того, вездесущий формат изображений gif также использует эти методы

Алгоритмы сжатия данных

301

сжатия. Алгоритмы сжатия обрели популярность, поскольку они позволяли представлять одну и ту же информацию меньшим количеством битов, экономя место и пропускную способность. Позже они легли в основу разработки утили­ ты zipи ее вариантов. В основе стандарта сжатия V.44, используемого в модемах, лежат те же принципы.

Кодирование Хаффмана

Кодирование Хаффмана (Huffman coding) — один из старейших методов сжатия данных‚ основанный на построении дерева Хаффмана, которое используется как для кодирования, так и для декодирования данных. Кодирование Хаффма­ на представляет содержимое данных в более компактной форме, пользуясь тем, что некоторые данные (например, определенные символы алфавита) чаще по­ являются в потоке данных. При использовании кодировок разной длины (ко­ ротких — для наиболее часто встречающихся символов и длинных — для редко встречающихся) данные занимают меньше места.

Познакомимся с несколькими терминами, связанными с кодированием Хафф­ мана.

zz Кодирование. Преобразование одной формы представления данных в другую. Итоговая форма должна быть как можно более сжатой.

zz Кодовое слово. Определенный символ в закодированной форме.

zz Кодирование фиксированной длины. Каждый закодированный символ, то есть кодовое слово, использует одинаковое количество битов.

zz Кодирование переменной длины. Кодовые слова используют разное количество битов.

zz Оценка кода. Ожидаемое количество битов на кодовое слово.

zz Коды без префикса. Ни одно кодовое слово не является префиксом любого другого кодового слова.

zzДекодирование. Код переменной длины не должен содержать никаких пре­ фиксов.

Чтобы понять последние два термина, обратимся к табл. 11.1.

Можно сделать следующий вывод:

zz Код фиксированной длины для этой таблицы равен 3.

zzКод переменной длины равен 45(*1) + 0.13(*3) + 0.12(*3) + 0.16(*3) + + 0.09(*4) + 0.05(*4) = 2.24.

302

 

Глава 11. Алгоритмы обработки данных

Таблица 11.1

 

 

 

 

 

 

 

Символ

Частота

Код фиксированной длины

Код переменной длины

 

 

 

 

L

0.45

000

0

 

 

 

 

M

0.13

001

101

 

 

 

 

N

0.12

010

100

 

 

 

 

X

0.16

011

111

 

 

 

 

Y

0.09

100

1101

 

 

 

 

Z

0.05

101

1100

 

 

 

 

На следующей диаграмме показано дерево Хаффмана, созданное из предыду­ щего примера (рис. 11.2).

Рис. 11.2

Обратите внимание, что кодирование Хаффмана заключается в преобразовании данных в дерево Хаффмана, которое и обеспечивает сжатие. Декодирование (декомпрессия) возвращает данные в исходный формат.