Дискретная математика:
логика, группы, графы, фракталы
Акимов О.Е.
3.3. Кодирование, автоматы и группы на графах
Оптимальные деревья кодирования
Мы рассмотрели «азы» теории кодирования. К секретному кодированию мы больше не вернемся; корректирующее кодирование было детально рассмотрено в последнем подразделе главы «Группы»; остается рассмотреть методы оптимального кодирования, в частности, Фано и Хаффмана.
Фано предложил следующий принцип кодирования сообщений, имеющих вероятностную характеристику. Все сообщения выписываются в таблицу по степени убывания вероятности и разбиваются на две группы равной (на сколько это возможно) вероятности. Первой группе присваивается символ 0, второй — 1. Затем каждая группа вновь делится на две подгруппы равной вероятности, которым также присваиваются символы 0 и 1. В результате многократного повторения этой процедуры получается таблица кодовых слов. Продемонстрируем эту методику на конкретном примере.
Предположим необходимо закодировать 13 сообщений, причем вероятность одного из них равна 0,653, вероятность трех других сообщений равна 0,023, еще четырех — 0,027, и, наконец, пяти оставшихся — 0,034. Сумма вероятностей всех сообщений равна 1. Эти вероятности внесены во второй столбец табл. 3.13 в порядке убывания; первый столбец нумерует сообщения, а в третьем записаны окончательные коды Фано.
Таблица 3.13
n |
pn |
Коды |
1 |
0.653 |
0 |
2 |
0.034 |
1000 |
3 |
0.034 |
1001 |
4 |
0.034 |
10100 |
5 |
0.034 |
10101 |
6 |
0.034 |
1011 |
7 |
0.027 |
11000 |
8 |
0.027 |
11001 |
9 |
0.027 |
11010 |
10 |
0.027 |
11011 |
11 |
0.023 |
11100 |
12 |
0.023 |
11101 |
13 |
0.023 |
1111 |
Средняя длина кодового слова равна:
l = 2, 263.
Процедура кодирования с помощью двух символов может быть представлена
бинарным деревом (рис. 3.35). Длина ветвей, равная длине каждого кодового слова, определяет естественные порядковые уровни. В нашем дереве символу 0 отвечает ребро, отклоняющееся влево, а символу 1 — ребро, отклоняющееся вправо. Например, пятое сообщение имеет код 10101; соответствующая ему ветвь выделена жирной линией.
Рис. 3.35
Коды Фано по оптимальности несколько уступают кодам Хаффмана, который показал, что его методика дает предельное сжатие информационного текста. Пусть требуется закодировать все ту же последовательность сообщений. Кодовая таблица Хаффмана (табл. 3.14) начинает заполняться со столбца
P1; столбец P берем за исходный, а столбцы
K, K1, K2 и т.д. пока оставляем без внимания. В столбце
P1 выделенная (затемненная) вероятность получается путем сложения двух наименьших вероятностей (0.023 + 0.023), остальные вероятности записываются без изменений (в нашем числовом примере все выделенные вероятности оказались на второй строке; в общем случае это не выполняется).
Таблица 3.14
n |
P |
K |
P1 |
K1 |
P2 |
K2 |
P3 |
K3 |
P4 |
K4 |
P5 |
K5 |
1 |
0.653 |
0 |
0.653 |
0 |
0.653 |
0 |
0.653 |
0 |
0.653 |
0 |
0.653 |
0 |
2 |
0.034 |
1100 |
0.046 |
1011 |
0.050 |
1010 |
0.054 |
1001 |
0.061 |
1000 |
0.068 |
111 |
3 |
0.034 |
1101 |
0.034 |
1100 |
0.046 |
1011 |
0.050 |
1010 |
0.054 |
1001 |
0.061 |
1000 |
4 |
0.034 |
1110 |
0.034 |
1101 |
0.034 |
1100 |
0.046 |
1011 |
0.050 |
1010 |
0.054 |
1001 |
5 |
0.034 |
1111 |
0.034 |
1110 |
0.034 |
1101 |
0.034 |
1100 |
0.046 |
1011 |
0.050 |
1010 |
6 |
0.034 |
10000 |
0.034 |
1111 |
0.034 |
1110 |
0.034 |
1101 |
0.034 |
1100 |
0.046 |
1011 |
7 |
0.027 |
10001 |
0.034 |
10000 |
0.034 |
1111 |
0.034 |
1110 |
0.034 |
1101 |
0.034 |
1100 |
8 |
0.027 |
10010 |
0.027 |
10001 |
0.034 |
10000 |
0.034 |
1111 |
0.034 |
1110 |
0.034 |
1101 |
9 |
0.027 |
10011 |
0.027 |
10010 |
0.027 |
10001 |
0.034 |
10000 |
0.034 |
1111 |
|
|
10 |
0.027 |
10100 |
0.027 |
10011 |
0.027 |
10010 |
0.027 |
10001 |
0.034 |
|
|
|
11 |
0.023 |
10101 |
0.027 |
10100 |
0.027 |
10011 |
|
|
|
|
|
|
12 |
0.023 |
10110 |
0.023 |
10101 |
|
|
|
|
|
|
|
|
13 |
0.023 |
10111 |
|
|
|
|
|
|
|
|
|
|
Таблица 3.14 (Продолжение)
n |
P6 |
K6 |
P7 |
K7 |
P8 |
K8 |
P9 |
K9 |
P10 |
K10 |
P11 |
K11 |
1 |
0.653 |
0 |
0.653 |
0 |
0.653 |
0 |
0.653 |
0 |
0.653 |
0 |
0.653 |
0 |
2 |
0.068 |
110 |
0.096 |
101 |
0.115 |
100 |
0.136 |
11 |
0.211 |
10 |
0.347 |
1 |
3 |
0.068 |
111 |
0.068 |
110 |
0.096 |
101 |
0.150 |
100 |
0.136 |
11 |
|
|
4 |
0.061 |
1000 |
0.068 |
111 |
0.068 |
110 |
0.096 |
101 |
|
|
|
|
5 |
0.054 |
1001 |
0.061 |
1000 |
0.068 |
111 |
|
|
|
|
|
|
6 |
0.050 |
1010 |
0.054 |
1001 |
|
|
|
|
|
|
|
|
7 |
0.046 |
1011 |
|
|
|
|
|
|
|
|
|
|
Аналогично заполняются все последующие столбцы
P2, P3, и т.д. Далее Хаффман рассуждал следующим образом. Два сообщения с наименьшими вероятностями должны иметь одинаковые длины слов и различаться последними символами. Поэтому в последнем столбце
K11 против двух вероятностей выставляются символы 0 и 1. Затем идут по табл. 3.8 в обратном направлении, заполняя столбцы
K10, K9 ... K1, K. При этом символы 0 и 1 ставятся против тех вероятностей, которые в сумме давали подчеркнутую вероятность. В частности, сначала в столбце
K10 против вероятности 0.653 записываем 0, а против чисел
0.211 и 0.136 — 1. Затем к этим единицам приписываем новую пару символов 0 и 1, получая коды 10 и 11.
Затем обращаем внимание на подчеркнутое число 0,211 столбца
P10; оно получилось при суммировании чисел 0,15 и 0,096 столбца
P9, следовательно, этим вероятностям сообщаем одинаковый код 10 и приписываем по третьему символу, так что в столбце
K9 возникают коды 100 и 101. Два других кода — 0 и 11 — переписываются в
K9 из K10 без изменений. Продолжая эту процедуру, мы заполняем последний кодовый столбец
K, который образует окончательную систему кодовых слов. По ней вычерчиваем бинарное дерево (рис. 3.36) по тому же принципу, что и предыдущее дерево, т.е. отклонение ребра влево означает ноль, вправо — 1.
Рис. 3.36
Средняя длина слова, закодированного по Хаффману, равна 2,252, что несколько меньше, чем закодированного по Фано. Большей оптимизации достичь невозможно, за исключением случая, когда вместо двух символов (0 и 1) используется три символа — 0, 1 и 2. Тринарное дерево Хаффмана изображено на рис. 3.37. По нему легко установить коды сообщений, если помнить, что для каждого ребра левое ребро означает 0, правое — 2, а серединное — 1. Методика, по которой рассчитываются коды, та же, что и в предыдущем случае, только суммируются не две наименьшие вероятности, а три. Длина кодового слова при тринарной кодировке равна 1,592, что в полтора раза выше, чем при бинарном кодировании.
Рис. 3.37
Кодовые деревья Фано и Хаффмана можно рассматривать как графическое задание алгоритмов поиска. При таком понимании средняя длина кодового слова пропорциональна стоимости поиска: чем выше частота обращения к концевой (внешней) вершине, тем меньше должна быть длина пути к ней. С этой точки зрения, рассмотренные деревья являются оптимальными только в отношении обращения к конечным вершинам. А как нужно было бы изменить алгоритм построения оптимального дерева, если бы наряду с вероятностями обращения к внешним вершинам были бы заданы вероятности обращения и к внутренним вершинам?
Пусть задан тот же ряд вероятностей, который, однако, мы разделим на две части; первая часть будет связана с вероятностью обращения к внешним вершинам ai (табл. 3.15), вторая — с вероятностью обращения к внутренним вершинам bi (табл. 3.16).
Таблица 3.15
Вершина |
a0 |
a1 |
a2 |
a3 |
a4 |
a5 |
a6 |
Вероятность |
0.653 |
0.034 |
0.034 |
0.027 |
0.027 |
0.023 |
0.023 |
Таблица 3.16
Вершина |
b1 |
b2 |
b3 |
b4 |
b5 |
b6 |
Вероятность |
0.034 |
0.034 |
0.034 |
0.027 |
0.027 |
0.023 |
Нахождение бинарного дерева по оптимальному достижению внешних и внутренних вершин начнем с допущения. Предположим, что дерево
ti,j является оптимальным, а внутренняя вершина
bk — его корень. Тогда это дерево можно разбить на два поддерева:
ti,k–1, являющимся оптимальным на вершинах
{ai, bi+1, ai+1 ...
bk–1, ak–1}, и tk,j — оптимальное на вершинах
{ak, bk+1, ak+1 ...
bj, aj}. В отношении индексов должно выполняться условие:
i ≤ k ≤ j. Суммарная частота обращения к вершинам дерева
ti,j рассчитывается по формуле:
ri,j = qi,j + min(ri,k–1 +
rk,j), qi,j =
qi,j–1 + p(aj) + p(bj),
где p(aj) и p(bj) — вероятности обращения к вершинам
aj и bj, а индекс k под знаком min пробегает значения от
i до j. Результаты расчета оформим таблицей, в которой по горизонтали меняется значение индекса
i, а по вертикали — h; при этом j = i +
h. В каждую клетку таблицы будем заносить значения
ri,j и qi,j.
Понятно, что ti,i являются «пустыми» деревьями с корнем во внешней вершине
ai (ri,i = 0, qi,i = pi). Таким образом, первая строка табл. 3.17 заполняется без предварительного расчета. Вторая строка этой таблицы также не требует больших вычислений, поскольку для деревьев типа
ti,i+1, состоящих из двух вершин и одного инцидентного им ребра, выполняется условие:
ri,i+1 = qi,i+1, или конкретно:
q0,1 = q0,0 + p(a1) +
p(b1) = 0.653 + 0.034 + 0.034 = 0.721,
q1,2 = q1,1 + p(a2) +
p(b2) = 0.034 + 0.034 + 0.034 = 0.102,
q2,3 = 0.095, q3,4 =
0.081, q4,5 = 0. 077, q5,6 =
0.065.
Третью строку табл. 3.17 вычисляем с учетом минимальной вероятности поддеревьев:
q0,2 = q0,1 + p(a2) +
p(b2) = 0.721 + 0.034 + 0.034 = 0.789,
r0,2 = q0,2 + = 0.789 + 0.102 = 0.891;
q1,3 = q1,2 + p(a3) +
p(b3) = 0.102 + 0.034 + 0.027 = 0.163,
r1,3 = q1,3 + = 0.163 + 0.095 = 0.258; и т.д.
Покажем, как выглядят конкретные формулы для вычисления вероятности
r1,6:
q1,6 = q1,5 + p(a6) +
p(b6) = 0.267 + 0.023 + 0.023 = 0.313,
r1,6 = q1,6 + = 0.313 + (0.102 + 0.327) = 0.742.
Таблица 3.17
q0,0 = 0.653
r0,0 = 0.000 |
q1,1 = 0.034
r1,1 = 0.000 |
q2,2 = 0.034
r2,2 = 0.000 |
q3,3 = 0.027
r3,3 = 0.000 |
q4,4 = 0.027
r4,4 = 0.000 |
q5,5 = 0.023
r5,5 = 0.000 |
q6,6 = 0.023
r6,6 = 0.000 |
q0,1 = 0.721
r0,1 = 0.721 |
q1,2 = 0.102
r1,2 = 0.102 |
q2,3 = 0.095
r2,3 = 0.095 |
q3,4 = 0.081
r3,4 = 0.081 |
q4,5 = 0.077
r4,5 = 0.0.077 |
q5,6 = 0.069
r5,6 = 0.0.069 |
|
q0,2 = 0.781
r0,2 = 0.891 |
q1,3 = 0.163
r1,3 = 0.258 |
q2,4 = 0.149
r2,4 = 0.230 |
q3,5 = 0.131
r3,5 = 0.208 |
q4,6 = 0.123
r4,6 = 0.192 |
|
|
q0,3 = 0.850
r0,3 = 1.108 |
q1,4 = 0.217
r1,4 = 0.400 |
q2,5 = 0.199
r2,5 = 0.371 |
q3,6 = 0.177
r3,6 = 0.327 |
|
|
|
q0,4 = 0.904
r0,4 = 1.304 |
q1,5 = 0.267
r1,5 = 0.577 |
q2,6 = 0.245
r2,6 = 0.532 |
|
|
|
|
q0,5 = 0.954
r0,5 = 1.531 |
q1,6 = 0.313
r1,6 = 0.742 |
|
|
|
|
|
q0,6 = 1.000
r0,6 = 1.742 |
|
|
|
|
|
|
Здесь минимальная вероятность получается во второй строке (r1,2 + r3,6) при значении k = 3, следовательно, корневой вершиной дерева t1,6 с поддеревьями t1,2 и t3,6 будет b3. Итак, все внутренние вершины являются корнями своих поддеревьев; выпишем их:
b1: t0,6 = t0,0 + t1,6,
b2: t1,2 = t1,1 + t2,2,
b3: t1,6 = t1,2 + t3,6,
b4: t3,6 = t3,3 + t4,4,
b5: t3,6 = t3,4 + t5,6,
b6: t5,6 = t5,5 + t6,6.
После этого можно приступать к вычерчиванию бинарного дерева оптимального поиска (рис. 3.38).
Рис. 3.38
Вершины построенного нами дерева можно было бы закодировать. Однако, с точки зрения теории кодирования, получающийся при этом код не был бы префиксным. Тем не менее, среднюю длину слова здесь рассчитать можно:
+ ,
где li — длина пути до внешней вершины
ai, lj — длина пути до внутренней вершины
bj. Если все вычисления проделаны верно, то средняя длина кодового слова
l должна в точности совпасть со стоимостью поиска по дереву
t0,6: l = r0,6, что в нашем случае имеет место. Данное равенство играет роль проверочного соотношения.