
Сжатие
Сжатие – это любая процедура, уменьшающая потребности файла (или сообщения) в данных, серьёзно не ухудшающая целостность этого файла.
Сжатие является важной частью современной информационной технологии и широко используется для сокращения размера файла текста, музыки, графики, видео, а также больших наборов данных.
Существуют десятки методов сжатия, каждый из которых имеет свои преимущества и сферы применения.
Рассмотрим это явление с позиции теории информации.
Кодирование по алгоритму Хаффмена
Проблема отыскания моментальных кодов минимальной средней длины L. Как известно, H<=L<=H+1.
Для студента МТИ Хаффмена это была тема курсовой работы, выданная профессором Фэно. Работая над этой темой Хаффман (не зная, что Шеннон и Фэно сами уже предпринимали попытку решить эту проблему) открыл простой способ создания кода. С тех пор подобный подход к кодированию стал называться кодированием по алгоритму Хаффмена.
Алгоритм учитывает количество символов источника и их вероятности и создаёт код со средней длиной L, достаточно близкий к энтропии источника H.
Однако, следует отметить, что построенный по этой методике код может быть не уникальным, т.е. с одной и той же минимальной средней длиной можно создать несколько кодов (каждый из них будет называться кодом Хффмена).
Базовая идея алгоритма кодирования Хаффмена для двоичных кодов заключается в том, чтобы начинать с малого количества символов и переходить к большим количествам символов.
Легко закодировать источник с помощью двух символов, независимо от того, каковы их соответствующие вероятности: два кодовых слова должны быть просто 0 и 1, обеспечивая среднюю длину 1. Лучшего кода не существует!.
Усложним задачу. Пусть источник кодируется тремя символами, у каждого из которых есть своя вероятность.
В этом случае процесс кодирования по алгоритму Хаффмена будет состоять из нескольких шагов:
(этап сокращения) временно объединим два символа с самыми низкими вероятностями в один сложный символ с вероятностью, равной сумме вероятностей отдельных символов.
В результате вместо трёх символов останется только два (один сложный, полученный на первом шаге, со своей вероятностью и последний оставшийся из начального набора). Двух символьный источник легко кодируется символами 0 и 1.
(этап разделения) сложный символ разделяется на свои компоненты, которым присваиваются коды, имеющие общий префикс, соответствующий коду сложного символа, закреплённого за ним на первом шаге.
Проиллюстрируем эту задачу: Построим кодовое дерево.
Символ |
Вероятность |
Кодовое слово |
Вероятность |
К 1 0 одовоес |
S1 |
0.5 |
00 |
0.5 |
0 000 |
S2 |
0 |
1 |
0 |
1 11 |
S3 |
0.2 |
11 |
|
10 |
П
S3
осчитаем среднюю длину слов созданного кодаL
S1
S2
=(0,5х2)+(0,3х2)+(0,2х2)=2.Посчитаем энтропию данного источника
H=0,5 х log 0,5 +0,3 х log 0,3+0,2 х log 0,2=1,49.
Проверим свойство созданного кода
H<=L<H+1 => 1,49<=2<2,49,
что согласуется с утверждением о пределах средней длины слов кода:
«источник с энтропией H может кодироваться с помощью моментального двоичного кода средней длины L, удовлетворяющего H<=L<H+1».
Универсальное кодирование
Методика кодирования Хаффмена требует знания вероятностей символов.
Существуют специальные таблицы, указывающие на вероятность встречаемости букв того или иного алфавита. Вероятности рассчитаны на основе тысяч слов, взятых из различных источников.
Например:
Для русского алфавита:
Таблица 1. Частота появления букв |
|||||||
Буква |
Частота |
Буква |
Частота |
Буква |
Частота |
Буква |
Частота |
пробел |
0,175 |
o |
0,090 |
е, ë |
0,072 |
а |
0,062 |
и |
0,062 |
т |
0,053 |
н |
0,053 |
с |
0,045 |
р |
0,040 |
в |
0,038 |
л |
0,035 |
к |
0,028 |
м |
0,026 |
д |
0,025 |
п |
0,023 |
у |
0,021 |
я |
0,018 |
ы |
0,016 |
з |
0,016 |
ъ, ь |
0,014 |
б |
0,014 |
г |
0,013 |
ч |
0,012 |
й |
0,010 |
х |
0,009 |
ж |
0,007 |
ю |
0,006 |
ш |
0,006 |
ц |
0,004 |
щ |
0,003 |
э |
0,003 |
ф |
0,002 |
Если рассматривать специализированные технические документы, то частота использования символов может отличаться от стандартных таблиц вероятности. В этих случаях получающийся в результате код Хаффмена не достигает максимально возможного сжатия. В связи с этим были предложены различные адаптивные методы, модифицирующие список вероятностей в зависимости от фактической встречаемости в данных. Эти методы используют не вероятности, а частоты. При неопределённом времени использования адаптивного метода на неопределённом потоке встречаемости символов, в конце концов, расчётные частоты сойдутся с фактическими частотами, и степень компрессии будет максимальной. Такие методы, не требующие, чтобы вероятности сообщались заранее, но действующие в рамках предела (как будто они имеют эти вероятности) называют универсальными.