Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ТИ_2006_ВСЕ.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
4.19 Mб
Скачать

Методы энтропийного сжатия

Одним из наиболее часто используемых методов энтропийного сжатия относится метод Хаффмена, который заключается в последовательном выполнении следующих действий:

  1. определить список кодируемых символов и их частоты;

  2. отсортировать список символов по убыванию частот;

  3. если в списке только два символа, то перейти к п. 5, иначе – к п. 4.

  4. заменить два последних символа на один новый символ (составной символ), частота которого равна сумме их частот и перейти к п. 2;

  5. присвоить первому символу в списке код 0, а второму – код 1;

  6. найти первый от начала списка составной символ (см. п. 4) и заменить его на те два символа, из которых он был образован. При этом первому из восстановленных символов присвоить код составного символа с приписанным справа 0, а второму – код составного символа с приписанной справа 1;

  7. повторить п. 6 до тех пор пока не будет восстановлен исходный список символов, такой же как после выполнения п. 1.

Пример 5.5. Выполнить сжатие с помощью метода Хаффмена последовательности символов

aacabcccbbcabcabcacccda.

  1. Построить список символов исходной последовательности и их частот:

    Символ

    c

    a

    b

    d

    Частота

    10

    7

    5

    1

  2. Заменить символы b и d (два символа с наименьшими частотами) на символ s с частотой 6 (сумма частот символов b и d). Отсортировать полученный список символов:

    Символ

    c

    a

    s’

    Частота

    10

    7

    6

  3. Заменить символы a и s на символ s’’ с частотой 13. Отсортировать полученный список символов:

    Символ

    s’’

    c

    Частота

    13

    10

  4. Присвоить символу s’’ код 0, а символу c – код 1.

  5. Заменить символ s’’ на символы a и s. Присвоить символу a код 00, а символу s – код 01.

  6. Заменить символ s на символы b и d. Присвоить символу b код 010, а символу d – код 011.

Таким образом, получены следующие коды для символов исходной последовательности:

Символ

a

b

c

d

Код

00

010

1

011

Длина последовательности кодов равна

7  2 бита + 5  3 бита + 10  1 бит + 1  3 бита = 42 бита.

Если каждый символ исходной последовательности имеет длину 1 байт (8 бит), то длина исходной последовательности равна 23  8 бит = 184 бита, а коэффициент сжатия имеет значение 42 бит / 184 бита  0.228. Необходимо отметить, что энтропия исходной последовательности равна 1.72 бита. Эта величина близка средней длине кода, равной 1.82 бита. Именно поэтому метод Хаффмена относится к энтропийным методам сжатия.

На практике часто используется адаптивный вариант метода Хаффмена, при реализации которого частоты символов уточняются по мере сжатия. В отличие от первоначального алгоритма здесь требуется всего один проход по исходному файлу. Для этого вводится дополнительный символ ESC, который при декодировании показывает, что за ним следует несжатый символ. Символ ESC всегда имеет частоту 1 и размещается в конце списка. Приведем следующий алгоритм адаптивного сжатия по методу Хаффмена.

  1. Создать список, состоящий только из одного символа ESC с частотой 1.

  2. Прочитать символ последовательности. Если символ отсутствует в списке, то перейти к п. 3, иначе – к п. 4.

  3. Присвоить код символу ESC, выдать этот код, выдать прочитанный символ, добавить его в конец списка перед символом ESC с частотой 1 и перейти к п. 2.

  4. Присвоить код прочитанному символу, выдать этот код, увеличить на 1 частоту символа, переместить символ на место в списке, соответствующее новому значению частоты.

Пример 5.6. Выполнить сжатие последовательности символов

abacab

с помощью адаптивного варианта метода Хаффмена.

  1. Создать список из одного символа ESC с частотой 1.

Список:

Символ

ESC

Частота

1

  1. Прочитать символ a. Так как этот символ отсутствует в списке, то выдать код символа ESC – 0 и символ a. Включить символ a в список с частотой 1 перед символом ESC.

Список:

Символ

a

ESC

Частота

1

1

  1. Прочитать символ b. Так как этот символ отсутствует в списке, то выдать код символа ESC – 1 и символ b. Включить символ b в список с частотой 1 перед символом ESC.

Список:

Символ

a

b

ESC

Частота

1

1

1

  1. Прочитать символ a. Этот символ имеется в списке, поэтому его можно закодировать как 1. Частота символа a увеличивается на 1.

Список:

Символ

a

b

ESC

Частота

2

1

1

  1. Прочитать символ c. Так как этот символ отсутствует в списке, то выдать код символа ESC – 11 и символ c. Включить символ c в список с частотой 1 перед символом ESC.

Список:

Символ

a

b

c

ESC

Частота

2

1

1

1

  1. Прочитать символ a. Этот символ имеется в списке, поэтому его можно закодировать как 1. Частота символа a увеличивается на 1.

Список:

Символ

a

b

c

ESC

Частота

3

1

1

1

  1. Прочитать символ b. Этот символ имеется в списке, поэтому его можно закодировать как 10. Частота символа b увеличивается на 1.

Список:

Символ

a

b

c

ESC

Частота

3

2

1

1

Таким образом, после выполнения сжатия получается следующая последовательность кодов:

0 a 1 b 1 11 c 1 10.

Кроме метода Хаффмена к энтропийным методам относится также метод Шеннона – Фано. Однако в настоящее время он используется гораздо реже по сравнению с методом Хаффмена.