- •Донецк, 2009
- •Лабораторная работа №1 Кодирование информации в компьютере Вещественные числа
- •Целые числа
- •Символьная информация
- •Задания:
- •Лабораторная работа №2 Арифметические операции над целыми числами Сложение и вычитание
- •Умножение и деление
- •Арифметические действия над нормализованными числами
- •Сложение и вычитание
- •Задания
- •Лабораторная работа №3 Способы измерения информации
- •Задания
- •Лабораторная работа №4 Сжатие информации. Алгоритм Шеннона-Фэно
- •Лабораторная работа №5 Сжатие информации. Алгоритм Хаффмена
- •Лабораторная работа №6 Сжатие информации. Арифметическое кодирование
- •Лабораторная работа № 7 Сжатие информации. Словарно-ориентированные алгоритмы (lz77, lzss)
- •Алгоритм lzss
- •Литература cодержание
Лабораторная работа №5 Сжатие информации. Алгоритм Хаффмена
Метод Хаффмена (Huffman) разработан в 1952 г. Он более практичен и никогда по степени сжатия не уступает методу Шеннона-Фэно, более того, он сжимает максимально плотно. Код строится при помощи двоичного (бинарного) дерева. Вероятности (частоты) значений д.с.в. приписываются его листьям; все дерево строится, опираясь на листья. Величина, приписанная к узлу дерева, называется весом узла. Два листа с наименьшими весами создают родительский узел с весом, равным сумме их весов; в дальнейшем этот узел учитывается наравне с оставшимися листьями, а образовавшие его узлы от такого рассмотрения устраняются. После постройки корня нужно приписать каждой из ветвей, исходящих из родительских узлов, значения 0 или 1. Код каждого значения д.с.в. – это число, получаемое при обходе ветвей от корня к листу, соответствующему данному значению.
Замечание: Для методов Хаффмена и Шеннона-Фэно каждый раз вместе с собственно сообщением нужно передавать и таблицу кодов.
Пример: Закодируем с помощью метода Хаффмена фразу «Иванов Иван Иванович»
1. Вычисляем количество символов в сообщении (без учета пробелов) и частоту каждого символа.
L=18.
-
И
В
А
Н
О
Ч
4
5
3
3
2
1
2. Упорядочиваем символы по частоте появления в тексте по убыванию: В – И – А – Н – О – Ч.
3. Записываем символы и их частоты в таблицу. Выбирая последовательно пару самых малых частот, строим двоичное дерево. Для каждого полученного узла в качестве частоты записываем сумму частот узлов, его образующих.
Символ |
В |
|
И |
|
А |
|
Н |
|
О |
|
Ч |
Частота |
5 |
|
4 |
|
3 |
|
3 |
|
2 |
|
1 |
0 1 (5)
Ш аг 1 3
0 1 (4)
Ш аг 2 6
0 1 (3)
Ш аг 3 7 0 1 (2)
Ш аг 4 11
0 1 (1)
Шаг 5 18
4. Каждой из ветвей, выходящей из узла, присваиваем код 0 или 1 слева направо, начиная с нижнего узла (синий цвет на рисунке).
5. Код каждого символа получаем при обходе ветвей от корня (нижнего узла) к листу (самому верхнему узлу), соответствующему данному символу.
В – 10 ( )
И – 00 ( )
А – 01 ( )
Н – 110 ( )
О – 1110 ( )
Ч – 1111 ( )
- средняя длина кода
Задание: Закодировать свою фамилию, имя отчество с помощью метода Хаффмена. Вычислить среднюю длину кода. Вычислить энтропию исходного текста.