Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Kizi_new.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
564.22 Кб
Скачать

2.2 Алгоритм динамического кодирования методом fgk

Впервые алгоритм синтеза динамического кода Хаффмена был предложен Н. Феллером в 1973 году, а затем модифицирован Р. Галлагером и Д. Кнутом [28,32]. В связи с этим он получил название «алгоритм FGK».

Введем некоторые обозначения, которые будут использоваться при анализе и синтезе динамического кодового дерева Хаффмена по алгоритму FGK: m – размер алфавита источника сообщений; zjj-й символ алфавита; M(k) = z(1), z(2), … , z(k) – первые k символов в сообщении; k – число символов в сообщении, обработанных до текущего момента времени; z(k)k-й символ в сообщении; К – количество различных символов, обработанных на текущий момент времени; Wj – число (вес) символов zj, поступивших на момент обработки сообщения; lj – расстояние от корня дерева до zj-го листа.

Суть алгоритма синтеза динамического дерева Хаффмена состоит в процедуре вычисления листьев и построении бинарного дерева с минимальным весом пути. Процедуру кодирования можно условно разбить на два этапа, хотя при реализации алгоритма они могут легко быть объединены в один. На первом этапе дерево Хаффмена, построенное после обработки сообщения M(k), преобразуется в другое, эквивалентное исходному, которое затем простым приращением весов может быть преобразовано в хаффменовское дерево для M(k+l).

Первый этап начинается после получения от источника символа z(k+1) с присвоения статуса текущего узла листу z(k+1). Затем происходит обмен текущего узла (включая образованное им поддерево), с узлом, имеющим наибольший порядковый номер с таким же весом. После этого в качестве нового текущего узла инициализируется родительский узел последнего текущего узла. Обмен узлами в случае необходимости многократно повторяется, пока не будет достигнут корень дерева. Несложно убедиться, что максимальное количество перестановок, которые могут понадобиться при модификации кодового дерева, равно высоте дерева lmax. На втором этапе инкрементируется лист дерева, соответствующий обрабатываемому символу и последующие промежуточные узлы, расположенные на пути движения от листа к корню дерева.

Если построение дерева Хаффмена не завершено (т.е. на дереве присутствуют еще не все символы), то для отображения на дереве оставшихся (m-K) букв алфавита используют вспомогательный узел с нулевой вероятностью появления символа, т.е. весом W0=0. Тогда при поступлении очередного символа z(k+1), отсутствующего на дереве, нулевой узел расщепляется на два листа, а сам становится родителем вновь созданных узлов. Один из листьев (левый) является новым нулевым узлом и соединяется нулевой ветвью с родительским узлом, а второй отображает вновь поступивший символ и соединяется единичной ветвью со своим родителем. Дальнейшее построение и модификация дерева осуществляется в соответствии с описанной выше процедурой.

Основой алгоритма FGK хаффменовского кодирования-декодирования является процедура построения и динамической модификации кодового дерева Хаффмена. Алгоритм модификации дерева сводится к следующим формальным действиям:

НАЧАЛО

q:= лист дерева, соответствующий символу z(k+1);

ЕСЛИ q является нулевым узлом и К < (т – I), ТО

Начало

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

q:= только что созданный правый дочерний узел

Конец;

ЕСЛИ q и нулевой узел являются дочерними узлами одного родителя, ТО

Начало

Поменять местами q и лист, имеющий максимальный номер того же самого веса;

Увеличить вес q на единицу;

q:= родитель q {Новым текущим узлом становится родитель q}

Конец;

ПОКА q не стало корнем дерева ВЫПОЛНЯТЬ

Начало {Основной цикл}

Обменять q с узлом с максимальным номером того же самого веса;

{q является теперь узлом с максимальным номером того же веса};

Увеличить вес q на единицу;

q:= родитель q {Новым текущим узлом становится родитель q}

Конец;

КОНЕЦ.

Рассмотрим алгоритм построения и модификации кодового дерева Хаффмена на примере кодирования строки символов «fghrrrgg».

Кодер и декодер начинают строить кодовое дерево с корневого узла, соединенного нулевой ветвью с узлом, имеющим нулевой вес, обозначенным символом *. При поступлении первого символа кодер создает новый узел и соединяет его единичной ветвью с корневым узлом. На приемную сторону вновь поступающий символ передается в несжатом виде, но чтобы приемник распознал, что будет передаваться вновь появившийся символ, кодер отмечает его, выдавая префиксную комбинацию, в качестве которой используется код листа с нулевым весом. В алгоритме FGK несжатый символ передается не ASCII-кодом, а минимальным префиксным кодом, как было предложено Д. Кнутом (если число символов исходного алфавита m представить в виде m=2e+r, то в случае поступления символа с порядковым номером k таким, что 1<k<2r, то он передается (е+1)-значным кодом числа k-1, в противном случае – е-значным кодом числа k-r-1. В данном случае для английского алфавита m=27, e=4, r=11).

При поступлении первого символа сообщения «f», кодер создает новый узел и соединяет его единичной ветвью с узлом, имеющим нулевой вес (рисунок 6.3а), после чего вес корневого узла увеличивается на единицу. На приемную сторону выдается минимальный префиксный код символа. Символ «f» имеет порядковый номер по алфавиту 6 (k=6), поэтому на приемную сторону поступит 00101 (е+1-значный код числа k-1, т.е. 5-значный код числа 5).

При поступлении второго символа «g» узел с нулевым весом расщепляется на два листа, а сам становится родительским. Новый узел (узел 2) соединяется с ним единичной ветвью (рисунок 6.3б). Т.к. символ поступает впервые, то на приемную сторону перед выдачей несжатого кода символа выдается префиксная комбинация – код нулевого узла – 0 (из рисунка 6.3а видно, что код нулевого узла – 0). Затем на приемную сторону выдается минимальный префиксный код символа «g». Символ «g» имеет порядковый номер по алфавиту 7 (k=7), поэтому на приемную сторону поступит 00110 (е+1-значный код числа k-1, т.е. 5-значный код числа 6).

Рисунок 6.3 – Построение и модификация дерева для сообщения «fgh»

При поступлении третьей буквы сообщения – буквы «h» - дерево нуждается в модификации. Текущим узлом назначается лист 2 (рисунок 6.3в). Т.к. символ появился впервые, его вес пока равен 0, и т.к. на дереве нет листьев, имеющих больший порядковый номер и нулевой вес, то увеличиваем вес листа 2 и назначаем текущим родительский узел – узел 3. Узел 3 имеет пока еще нулевой вес, и нет узла, имеющего больший порядковый номер и нулевой вес, поэтому увеличиваем вес узла 3 и назначаем текущим его родителя – узел 5. Узел 5 имеет вес равный 1, и, как видно, имеется лист с большим порядковым номером и весом 1 – это лист 6. Обмениваем узел 5 вместе с преобразованным им поддеревом и лист 6 местами, и затем увеличиваем его вес. Далее переходим к родительскому узлу 7, а, т.к. этот узел корневой, то модификация дерева завершена.

r

r

0

0

1

1

0

0

1

1

0

0

1

1

2r

0

1

1

0

0*

1h

1r

1f

1g

1h

1f

0*

1g

a)

б)

Рисунок 4 – Модификация дерева после прихода символов «rr»

Т.к. символ «h» поступил впервые, на приемную сторону выдается префиксная комбинация – 00 (соответствует нулевому узлу на рисунке 6.3б), а затем минимальный префиксный код символа «h». Символ «h» имеет порядковый номер по алфавиту 8 (k=8), поэтому на приемную сторону поступит 00111 (е+1-значный код числа k-1, т.е. 5-значный код числа 7).

Дальнейшее построение дерева представлено на рисунке 6.4 и рисунке 6.5. Как видно из рисунков, на выход кодера на приемной стороне будут выдаваться следующие комбинации:

  • при поступлении первого символа «r»: «100 10000» («100» - префиксная комбинация нулевого узла и «10000» - минимальный префиксный код буквы «r»);

  • при поступлении второго символа «r»: «001»;

  • при поступлении третьего символа «r»: «11»;

  • при поступлении символа «g»: «1101»;

  • п ри поступлении последнего символа «g»: «10».

Рисунок 6.5 – Модификация дерева после прихода «rgg»

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]