Пример декодирования сообщения
Пусть из имеющихся символов передано сообщение а1, а5, а3, а7, а2, а3.
При кодировании, используя табл. 1 получим следующую последовательность: 11010 01100 10000 111101 110110 10110 100010
|
11010 |
01100 |
10000 |
111101 |
110110 |
10110 |
100010 |
111 |
11000 |
111111 |
111010 |
|
Л |
Ю |
б |
и |
м |
ы |
й |
|
к |
о |
Т |
Получив сообщение подобного вида, необходимо её декодировать, чтобы прочитать сообщение. Считаем, что получатель имеет таблицу кодировки символов, идентичную с отправителем.
Возможный способ декодирования показан в таблице:
|
Шаг |
Комбинация |
Кол-во символов |
Символ |
|
1 |
010 |
4 |
- |
|
2 |
0100 |
2 |
- |
|
3 |
11010 |
1 |
л |
|
4 |
000 |
4 |
- |
|
5 |
0000 |
5 |
- |
|
6 |
00001 |
5 |
- |
|
7 |
000010 |
3 |
- |
|
8 |
0000100 |
2 |
- |
|
9 |
01100 |
1 |
ю |
|
10 |
000 |
4 |
- |
|
11 |
0001 |
4 |
- |
|
12 |
00010 |
4 |
- |
|
13 |
10000 |
1 |
б |
|
14 |
101 |
2 |
- |
|
15 |
111101 |
1 |
и |
|
16 |
011 |
3 |
- |
|
17 |
110110 |
1 |
м |
|
18 |
001 |
7 |
- |
|
19 |
0010 |
4 |
- |
|
20 |
00101 |
2 |
- |
|
21 |
10110 |
1 |
ы |
|
22 |
000 |
4 |
- |
|
23 |
0001 |
4 |
- |
|
24 |
00011 |
2 |
- |
|
25 |
100010 |
1 |
й |
|
26 |
111 |
1 |
|
|
27 |
001 |
7 |
- |
|
28 |
0011 |
3 |
- |
|
29 |
11000 |
1 |
к |
|
30 |
110 |
2 |
- |
|
31 |
111111 |
1 |
о |
|
32 |
110 |
2 |
- |
|
33 |
111010 |
1 |
т |
От недостатка неоднозначного кодирования, рассмотренного в предыдущей лабораторной работе алгоритма свободна методика Д. Хаффмана.
Метод Хаффмана
Для двоичного кода алгоритм Хаффмана сводится к следующему:
Шаг 1. Символы выписываются в основной столбец и снова сортируются от самой большой вероятности к самой маленькой. Два последних символа объединяются в один вспомогательный, которому приписывается суммарная вероятность.
Шаг 2. То, что осталось, и полученная суммарная вероятность снова располагаются по убыванию в дополнительном столбце, а две последних вероятности складываются. Повторять пока в последнем столбике должна остаться единица.
Шаг 3. Строится кодовое дерево и составляются кодовые слова.
«Корнем» дерева будет единица. Оттуда направляются две ветви. Ветви с большей вероятностью присваивается символ 1, а с меньшей — символ 0. Это повторяется до тех пор, пока не дойдём до каждого символа.

|
Символы |
Вероятности P(a) |
Шаг 1 |
Шаг 2 |
Шаг 3 |
Шаг 4 |
Шаг 5 |
Шаг 6 |
Шаг 7 |
|
а1 |
0,04 |
0,04 |
0,04 |
0,04 |
0,04 |
0,04 |
0,04 |
0,113 |
|
а2 |
0,044 |
0,044 |
0,044 |
0,044 |
0,044 |
0,044 |
0 |
|
|
а3 |
0,019 |
0,019 |
0,019 |
0,019 |
0,019 |
0 |
|
|
|
а |
0,015 |
0,015 |
0,015 |
0,015 |
0,046 |
|
|
|
|
а5 |
0,005 |
0,005 |
0,005 |
0,031 |
|
|
|
|
|
а6 |
0,002 |
0,002 |
0,026 |
|
|
|
|
|
|
а7 |
0,004 |
0 |
|
|
|
|
|
|
|
а8 |
0 |
|
|
|
|
|
|
|
Таким образом, символам источника соответствуют концевые вершины дерева. Кодовые слова, соответствующие символам, определяются путями из начального узла дерева к концевым. Каждому ответвлению соответствует символ 1 в результатирующем коде, а вправо — символ 0.
Поскольку только концевым вершинам кодового дерева соответствуют кодовые слова, то ни одно кодовое слово не будет началом другого. Тем самым гарантируется возможность разбиения последовательности кодовых слов на отдельные кодовые слова.
Теперь, двигаясь по кодовому дереву сверху вниз, можно записать для каждой буквы соответствующую ей кодовую комбинацию:
а1 а2 а3 а4 а5 а6 а7 а8

,109
,065
4
,024
,02