Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
33
Добавлен:
02.05.2014
Размер:
1.35 Mб
Скачать
    1. Минимизация средней длины кодового слова.

Идея использования кодов переменной длины для сжатия данных состоит в том, чтобы сообщениям с большей вероятностью появления ставить в соответствие кодовые комбинации меньшей длины и, наоборот, сообщения с малой вероятностью появления кодировать словами большей длины. Средняя длина кодового слова определяется следующим образом: , где li длина кодового слова для кодирования i-го сообщения, pi - вероятность появления i-го сообщения.

Например, пусть множество сообщений (0,1,…,9) характеризуется вероятностями (1/55,2/55, …,10/55). Если воспользоваться кодовыми словами кода на рис. 3, то экономный код будет иметь следующий вид:

Сообщение

Вероятность

Код

Сообщение

Вероятность

Код

0

1/55

111111

5

6/55

1000

1

2/55

111110

6

7/55

110

2

3/55

11110

7

8/55

101

3

4/55

1110

8

9/55

01

4

5/55

1001

9

10/55

00

Подсчитаем среднюю длину кодового слова для этого кода

L=6(1/55=2/55)+5(3/55)+4(4/55+5/55+6/55)+3(7/55+8/55)+2(9/55+10/55)=3.2 бит/сообщение.

Если бы мы закодировали сообщения равномерным кодом, то нам потребовались бы кодовые слова, содержащие не менее L=[log210]+1=4 бит/сообщение ([…] означает округление до меньшего целого). Таким образом, налицо увеличение экономичности кода.

Возникает вопрос, как выбрать кодовые слова, чтобы для заданных вероятностей p1,p2,…..pN обеспечить по возможности меньшую среднюю длину кодового слова?

Для ответа на этот вопрос учтем тот очевидный факт, что равномерный код, всем кодовым комбинациям которого соответствуют равновероятные сообщения, является оптимальным, т.е. имеет минимальную длину кодового слова. На каждом шаге двоичного кодирования производится разбиение множества сообщений на два подмножества, причем одному из них приписывается единица, а другому – ноль. Таким образом, на каждом шаге производится кодирование подмножеств равномерным кодом длиной в I двоичный знак. Отсюда следует принцип: нужно стремиться так производить разбиение на два подмножества, чтобы суммарные вероятности подмножеств были одинаковыми (или как можно более близкими друг к другу).

    1. Процедура Шеннона-Фано экономного кодирования.

В этом алгоритме используется следующий способ разбиения на два подмножества на каждом шаге кодирования. Предварительно производится упорядочивание сообщений по убыванию (или возрастанию) вероятностей pi. Разбиения на множества производится путем выбора разделяющей границы в упорядоченной последовательности так, чтобы суммарные вероятности подмножеств были по возможности одинаковыми. На рис. 4 приведено кодовое дерево, построенное этим методом для рассмотренного выше примера.

Рис. 4. Кодовое дерево, построенное процедурой

Шеннона-Фано.

Для наглядности в вершины дерева записаны подмножества кодируемых сообщений, а возле вершин – суммарные вероятности соответствующих подмножеств.

Прямой подсчет дает следующее значение средней длины кодового слова L=3.145. Это более экономно, чем в предыдущем примере. Процедура Шеннона-Фано является простым алгоритмом построения экономного кода, однако это не всегда самый лучший из возможных алгоритмов

1.5. Процедура Хафмана экономного кодирования.

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

Процедура Хафмана представляет собой рекурсивный алгоритм, стоящий бинарное кодовое дерево в обратную сторону, т.е. от конечных вершин к корню. Конечные вершины представляют отдельные сообщения и их вероятности, корень представляет множество всех сообщений с суммарной вероятностью, равной единице, а внутренние вершины, а внутренние вершины представляют сгруппированные подмножества и их суммарные вероятности. Пусть Pm – задача кодирования сообщений, где сообщение i имеет вероятность появления pi и Основная идея алгоритма состоит в том, чтобы объединить два сообщения с наименьшими вероятностями в одно множество и далее решать задачу Pm-1 c m-1 сообщениями и вероятностями Практически кодовое дерево в явном виде строится в обратном направлении, как показано на рис. 5 для нашего примера.

Рис. 5. Кодовое дерево, построенное процедурой Хавмана.

Прямой подсчет дает среднее значение длины кодового слова L=3.145, что совпадает с результатом, полученным с помощью процедуры Шеннона-Фано (это означает, что в данном примере процедура Шеннона-Фано также оказалась оптимальной).

Докажем оптимальность алгоритма Хафмана. Предположим, что pi упорядочены, т.е. Алгоритм объединяет p1 и p2 в одной вершине и затем решает редуцированную задачу m-1 сообщением. Когда решена редуцированная задача, вершина на рис. 6а в дереве, соответствующем решению редуцированной задачи, заменяется ан поддерево, показанное на рис. 6б.

Пусть - дерево, минимизирующее среднюю длину кодового слова L, а -внутренняя вершина, максимально удаленная от корня. Если p1 и p2 не являются вероятностями, приписанными преемника вершины , то можно эти значения поменять местами со значениями вероятностей действительных преемников , не увеличивая значения L. Это новое дерево минимизирует L и содержит поддерево в рис. 6б.

Пусть будет дерево , в котором поддерево с рис. 6б заменено вершиной с рис. 6а. Если мы сможем показать, что оптимально для задачи тогда и только тогда, когда оптимально для , то простая индукция докажет правильность алгоритма Хафмана. Мы покажем, что если оптимально для , то будет оптимально для . Предположим, что не оптимально для , а , оптимально.

Рис. 6. Объединение наименьших

вероятностей в процедуре

Хафмана.

Тогда . По условию задачидереводолжно иметь конечную вершину такого вида, как на рис. 6а. Заменим эту вершину поддеревом с рис. 6б и назовем это новое дерево . Тогда

что противоречит утверждению, что оптимально для .

Соседние файлы в папке Лекции по информатике2