Описание программы кодирования Хаффмана

Автор работы: Пользователь скрыл имя, 06 Мая 2013 в 20:37, курсовая работа

Краткое описание

В случайном текстовом файле мы ожидаем, что каждый символ встречается приблизительно равное число раз. Однако файлы, используемые на практике, навряд ли являются случайными. Они содержат осмысленные тексты, и по опыту известно, что, например, в типичном английском тексте некоторые буквы, такие, как «Е», «Т» и «А», встречаются гораздо чаще, чем «Z» и «Q». Это объясняет, почему код ASCII является избыточным, а также указывает на пути устранения избыточности. ASCII избыточен прежде всего потому, что независимо присваивает каждому символу, часто или редко используемому, одно и то же число бит (восемь). Чтобы удалить такую избыточность, можно воспользоваться кодами переменной длины, в котором короткие коды присваиваются буквам, встречающимся чаще, а редко встречающимся буквам достаются более длинные коды

Содержание

Введение………………………………………………………….………...……..3
Глава 1.Сжатие данных…………………………………………….…………..6
Типы сжатия…………………………………………………………………..6
Методы сжатия данных. Арифметическое кодирование……………...…12
Глава 2.Кодирование Хаффмана……………………………………………..30
2.1 Описание алгоритма, реализующего код Хаффмана……………………...30
2.2 Декодирование Хаффмана. Описание алгоритма, реализующего код Хаффмана………………………………………………………………………...39
Глава 3. Описание программы кодирования Хаффмана…………………51
3.1 Обоснование выбора инструментальных средств………………………....51
3.2 Описание основных функций программы, реализующей алгоритмы кодирования по методу Хаффмана……………………………………………..54
Заключение ……………………………………………………………………60
Список источников информации …………………………………………....61

Вложенные файлы: 1 файл

Алгоритмы сжатия данных бех потерь.Код Хаммфана.doc

— 723.00 Кб (Скачать файл)

 

.      (1.8)

 

При этом сам  код будет выглядеть так (1.9):

 

α(Q0 − 1) : β(n + 2IQ0 − S). (1.9)

 

Замечание

В качестве частных  случаев Start-step-stop кодов могут быть получены следующие коды и они  сведены в таблицу 1.14:

 

Таблица 1.14 –  Частный случай старт-шаг-стоп кодов

{i, j, k}

Диапазон

k, 1, k

простой бинарный код для целых чисел

0, 1, ∞

γ-код Элиаса

k, k, ∞

γ-код Элиаса по основанию 2k


 

 

 

 

 

 

 

 

 

Глава 2.Кодирование Хаффмана

2.1 Описание  алгоритма, реализующего код Хаффмана

 

Кодирование Хаффмана является простым алгоритмом для построения кодов переменной длины, имеющих минимальную среднюю длину. Этот весьма популярный алгоритм служит основой многих компьютерных программ сжатия текстовой и графической информации. Некоторые из них используют непосредственно алгоритм Хаффмана, а другие берут его в качестве одной из ступеней многоуровневого процесса сжатия. Метод Хаффмана [Huffman 52] производит идеальное сжатие (то есть, сжимает данные до их энтропии), если вероятности символов точно равны отрицательным степеням числа 2. Алгоритм начинает строить кодовое дерево снизу вверх, затем скользит вниз по дереву, чтобы построить каждый индивидуальный код справа налево (от самого младшего бита к самому старшему). Начиная с работ Д.Хаффмана 1952 года, этот алгоритм являлся предметом многих исследований. Алгоритм начинается составлением списка символов алфавита в порядке убывания их вероятностей. Затем от корня строится дерево, листьями которого служат эти символы. Это делается по шагам, причем на каждом шаге выбираются два символа с наименьшими вероятностями, добавляются наверх частичного дерева, удаляются из списка и заменяются вспомогательным символом, представляющим эти два символа. Вспомогательному символу приписывается вероятность, равная сумме вероятностей, выбранных на этом шаге символов. Когда список сокращается до одного вспомогательного символа, представляющего весь алфавит, дерево объявляется построенным. Завершается алгоритм спуском по дереву и построением кодов всех символов.

Лучше всего проиллюстрировать этот алгоритм на простом примере. Имеется пять символов с вероятностями, заданными на рис.2

Рис. 2. Коды Хаффмана.

Символы объединяются в пары в следующем порядке:

1.  объединяется с  , и оба заменяются комбинированным символом   с вероятностью 0.2;

2. Осталось четыре символа,   с вероятностью 0.4, а также   и   с вероятностями по 0.2. Произвольно выбираем   и  , объединяем их и заменяем вспомогательным символом   с вероятностью 0.4;

3. Теперь имеется три  символа   и   с вероятностями 0.4, 0.2 и 0.4, соответственно. Выбираем и объединяем символы   и   во вспомогательный символ   с вероятностью 0.6;

4. Наконец, объединяем  два оставшихся символа   и   и заменяем на   с вероятностью 1.

Дерево построено. Оно изображено на рис. 2а, «лежа на боку», с корнем справа и пятью листьями слева. Для назначения кодов мы произвольно приписываем бит 1 верхней ветке и бит 0 нижней ветке дерева для каждой пары. В результате получаем следующие коды: 0, 10, 111, 1101 и 1100. Распределение битов по краям - произвольное.

 

Средняя длина этого кода равна   бит/символ. Очень важно то, что кодов Хаффмана бывает много. Некоторые шаги алгоритма выбирались произвольным образом, поскольку было больше символов с минимальной вероятностью. На рис. 2b показано, как можно объединить символы по-другому и получить иной код Хаффмана (11, 01, 00, 101 и 100). Средняя длина равна   бит/символ как и у предыдущего кода.

Пример: Дано 8 символов А, В, С, D, Е, F, G и H с вероятностями 1/30, 1/30, 1/30, 2/30, 3/30, 5/30, 5/30 и 12/30. На рис. 2.1.а,b,с изображены три дерева кодов Хаффмана высоты 5 и 6 для этого алфавита.

Рис. 2.1. Три дерева Хаффмана для восьми символов.

Средняя длина  этих кодов (в битах на символ) равна

,

,

.

Пример: На рис. 2.1d показано другое дерево высоты 4 для восьми символов из предыдущего примера. Следующий анализ показывает, что соответствующий ему код переменной длины плохой, хотя его длина меньше 4.

(Анализ.) После  объединения символов А, В,  С, D, Е, F и G остаются символы ABEF (с вероятностью 10/30), CDG (с вероятностью 8/30) и H (с вероятностью 12/30). Символы ABEF и CDG имеют наименьшую вероятность, поэтому их необходимо было слить в один, но вместо этого были объединены символы CDG и H. Полученное дерево не является деревом Хаффмана.

Таким образом, некоторый произвол в построении дерева позволяет получать разные коды Хаффмана с одинаковой средней длиной. Напрашивается вопрос: «Какой код  Хаффмана, построенный для данного  алфавита, является наилучшим?» Ответ будет простым, хотя и неочевидным: лучшим будет код с наименьшей дисперсией.

Дисперсия показывает насколько сильно отклоняются длины  индивидуальных кодов от их средней  величины (это понятие разъясняется в любом учебнике по статистике). Дисперсия кода 2а равна :

,

а для кода 2b: 

.

Код 2b является более предпочтительным (это будет объяснено ниже). Внимательный взгляд на деревья показывает, как выбрать одно, нужное нам. На дереве рис. 2а символ   сливается с символом  , в то время как на рис. 2b он сливается с  . Правило будет такое: когда на дереве имеется более двух узлов с наименьшей вероятностью, следует объединять символы с наибольшей и наименьшей вероятностью; это сокращает общую дисперсию кода.

Если кодер  просто записывает сжатый файл на диск, то дисперсия кода не имеет значения. Коды Хаффмана с малой дисперсией более предпочтительны только в случае, если кодер будет передавать этот сжатый файл по линиям связи. В этом случае, код с большой дисперсией заставляет кодер генерировать биты с переменной скоростью. Обычно данные передаются по каналам связи с постоянной скоростью, поэтому кодер будет использовать буфер. Биты сжатого файла помещаются в буфер по мере их генерации и подаются в канал с постоянной скоростью для передачи. Легко видеть, что код с нулевой дисперсией будет подаваться в буфер с постоянной скоростью, поэтому понадобится короткий буфер, а большая дисперсия кода потребует использование длинного буфера.

Следующее утверждение  можно иногда найти в литературе по сжатию информации: длина кода Хаффмана символа   с вероятностью   всегда не превосходит  . На самом деле, не смотря на справедливость этого утверждения во многих примерах, в общем случае оно не верно. Я весьма признателен Гаю Блелоку, который указал мне на это обстоятельство и сообщил пример кода, приведенного в табл. 2.2. Во второй строке этой таблицы стоит символ с кодом длины 3 бита, в то время как ;

.

Код

0.01

000

6.644

7

0.30

001

1.737

2

0.34

01

1.556

2

0.35

1

1.515

2


 

Табл. 2.2. Пример кода Хаффмана.

Длина кода символа  , конечно, зависит от его вероятности  . Однако она также неявно зависит от размера алфавита. В большом алфавите вероятности символов малы, поэтому коды Хаффмана имеют большую длину. В маленьком алфавите наблюдается обратная картина. Интуитивно это понятно, поскольку для малого алфавита требуется всего несколько кодов, поэтому все они коротки, а большому алфавиту необходимо много кодов и некоторые из них должны быть длинными.

Рис. 2.3. Код Хаффмана для английского алфавита.

На рис. 2.3 показан код Хаффмана для всех 26 букв английского алфавита.

Случай алфавита, в котором символы равновероятны, особенно интересен. На рис. 2.3 приведены коды Хаффмана для алфавита с 5, 6, 7 и 8 равновероятными символами. Если размер алфавита   является степенью 2, то получаются просто коды фиксированной длины. В других случаях коды весьма близки к кодам с фиксированной длиной. Это означает, что использование кодов переменной длины не дает никаких преимуществ. В табл. 2.4 приведены коды, их средние длины и дисперсии.

Рис. 2.4. Коды Хаффмана с равными вероятностями.

Тот факт, что  данные с равновероятными символами  не сжимаются методом Хаффмана может  означать, что строки таких символов являются совершенно случайными. Однако, есть примеры строк, в которых  все символы равновероятны, но не являются случайными, и их можно сжимать. Хорошим примером является последовательность  , в которой каждый символ встречается длинными сериями. Такую строку можно сжать методом RLE, но не методом Хаффмана. (Буквосочетание RLE означает «run-length encoding», т.е. «кодирование длин серий». Этот простой метод сам по себе мало эффективен, но его можно использовать в алгоритмах сжатия со многими этапами, см. [Salomon, 2000).)

Табл. 2.4. Коды Хаффмана для 5 8 символов.

 

 

 

Ср.длина

Дисперсия

5

0.200

111

110

101

100

0

     

2.6

0.64

6

0.167

111

110

101

100

01

00

   

2.672

0.2227

7

0.143

111

110

101

100

011

010

00

 

2.86

0.1226

8

0.125

111

110

101

100

011

010

001

000

3

0


 

Заметим, что  метод Хаффмана не работает в случае двухсимвольного алфавита. В таком  алфавите одному символу придется присвоить код 0, а другому 1. Метод Хаффмана не может присвоить одному символу код короче одного бита. Если исходные данные (источник) состоят из индивидуальных битов, как в случае двухуровневого (монохромного) изображения, то возможно представление нескольких бит (4 или 8) в виде одного символа нового недвоичного алфавита (из 16 или 256 символов). Проблема при таком подходе заключается в том, что исходные битовые данные могли иметь определенные статистические корреляционные свойства, которые могли быть утеряны при объединении битов в символы. При сканировании монохромного рисунка или диаграммы по строкам пикселы будут чаще встречаться длинными последовательностями одного цвета, а не быстрым чередованием черных и белых. В итоге получится файл, начинающийся с 1 или 0 (с вероятностью 1/2). За нулем с большой вероятностью следует нуль, а за единицей единица. На рис. 2.5 изображен конечный автомат, иллюстрирующий эту ситуацию. Если биты объединять в группы, скажем, по 8 разрядов, то биты внутри группы будут коррелированы, но сами группы не будут иметь корреляцию с исходными пикселами. Если входной файл содержит, например, две соседние группы 00011100 и 00001110, то они будут кодироваться независимо, игнорируя корреляцию последних нулей первой группы и начальных нулей второй. Выбор длинных групп улучшает положение, но увеличивает число возможных групп, что влечет за собой увеличение памяти для хранения таблицы кодов и удлиняет время создания этой таблицы. (Напомним, что если группа длины   увеличивается до длины  , то число групп растет экспоненциально с   до  ).

Рис. 2.5. Конечный автомат.

Более сложный  подход к сжатию изображений с  помощью кодов Хаффмана основан  на создании нескольких полных множеств кодов Хаффмана. Например, если длина  группы равна 8 бит, то порождается несколько семейств кодов размера 256. Когда необходимо закодировать символ  , выбирается одно семейство кодов, и   кодируется из этого семейства.

 

 

 

 

 

 

 

 

 

 

2.2 Декодирование Хаффмана. Описание алгоритма, реализующего код Хаффмана

 

Перед тем как  начать сжатие потока данных, компрессор (кодер) должен построить коды. Это  делается с помощью вероятностей (или частот появления) символов. Вероятности  и частоты следует записать в  сжатый файл для того, чтобы декомпрессор (декодер) Хаффмана мог сделать декомпрессию данных. Это легко сделать, так как частоты являются целыми числами, а вероятности также представимы целыми числами. Обычно это приводит к добавлению нескольких сотен байтов в сжатый файл. Можно, конечно, записать в сжатый файл сами коды, однако это вносит дополнительные трудности, поскольку коды имеют разные длины. Еще можно записывать в файл само дерево Хаффмана, но это потребует большего объема, чем простая запись частот.

Информация о работе Описание программы кодирования Хаффмана