Строим дерево Хаффмана по количеству повторений символов в сообщении
считаем сколь раз повторяется каждый символ:
"К" повторяется 3 раза
"О" повторяется 3 раза
"Р" повторяется 4 раза
"Л" повторяется 5 раз
"Е" повторяется 3 раза
"В" повторяется 3 раза
"А" повторяется 7 раз
" " повторяется 3 раза
"У" повторяется 2 раза
"П" повторяется 1 раз
"Д" повторяется 1 раз
"И" повторяется 1 раз
Каждый символ помещаем в узел дерева с весом, равным числу повторений символа и сортируем по возрастанию весов:
{"П"(1)}
{"Д"(1)}
{"И"(1)}
{"У"(2)}
{"К"(3)}
{"О"(3)}
{"Е"(3)}
{"В"(3)}
{" "(3)}
{"Р"(4)}
{"Л"(5)}
{"А"(7)}
Объединяем 2 узла с минимальным весом в промежуточный узел и помещаем этот узел в список в соответствии с весом.
в результате длина списка уменьшится на 1 узел, этот шаг повторяется до тех пор пока не осмтанется один корневой узел.
после выполнения шага 1 получим:
Шаг 1
объединяем {"П"(1)} и {"Д"(1)} в узел {1 (2)},
первый элемент списка соответствует левому ребру с кодом 0, а второй ребру с кодом 1
{"И"(1)}
{1 (2)}
{"У"(2)}
{"К"(3)}
{"О"(3)}
{"Е"(3)}
{"В"(3)}
{" "(3)}
{"Р"(4)}
{"Л"(5)}
{"А"(7)}
Шаг 2
объединяем {"И"(1)} и {1 (2)} в узел {2 (3)}
{"У"(2)}
{2 (3)}
{"К"(3)}
{"О"(3)}
{"Е"(3)}
{"В"(3)}
{" "(3)}
{"Р"(4)}
{"Л"(5)}
{"А"(7)}
Шаг 3
объединяем {"У"(2)} и {2 (3)} в узел {3 (5)}
{"К"(3)}
{"О"(3)}
{"Е"(3)}
{"В"(3)}
{" "(3)}
{"Р"(4)}
{3 (5) }
{"Л"(5)}
{"А"(7)}
Шаг 4
объединяем {"К"(3)} и {"О"(3)} в узел {4 (6)}
{"Е"(3)}
{"В"(3)}
{" "(3)}
{"Р"(4)}
{3 (5) }
{"Л"(5)}
{4 (6)}
{"А"(7)}
Шаг 5
объединяем {"Е"(3)} и {"В"(3)} в узел {5 (6)}
{" "(3)}
{"Р"(4)}
{3 (5) }
{"Л"(5)}
{5 (6)}
{4 (6)}
{"А"(7)}
Шаг 6
объединяем {" "(3)} и {"Р"(4)} в узел {6 (7)}
{3 (5) }
{"Л"(5)}
{5 (6)}
{4 (6)}
{6 (7)}
{"А"(7)}
Шаг 7
объединяем {3 (5) } и {"Л"(5)} в узел {7 (10)}
{5 (6)}
{4 (6)}
{6 (7)}
{"А"(7)}
{7 (10)}
Шаг 8
объединяем {5 (6)} и {4 (6)} в узел {8 (12)}
{6 (7)}
{"А"(7)}
{7 (10)}
{8 (12)}
Шаг 9
объединяем {6 (7)} и {"А"(7)} в узел {9 (14)}
{7 (10)}
{8 (12)}
{9 (14)}
Шаг 10
объединяем {7 (10)} и {8 (12)} в узел {10 (22)}
{9 (14)}
{10 (22)}
Шаг 11
объединяем {9 (14)} и {10 (22)} в узел {11 (36)}
узел 11 является корневым узлом, строим дерево кодов начиная с узла 11.
по готовому дереву находим коды символов как путь от корня до листа
"А" двоичный код равен 01
"Л" двоичный код равен 101
"Р" двоичный код равен 001
" " двоичный код равен 000
"В" двоичный код равен 1101
"Е" двоичный код равен 1100
"О" двоичный код равен 1111
"К" двоичный код равен 1110
"У" двоичный код равен 1000
"И" двоичный код равен 10010
"Д" двоичный код равен 100111
"П" двоичный код равен 100110
Длина кодированного сообщения равна сумме произведений количества повторений каждого символа на длину его кода:
3*4+3*4+4*3+5*3+3*4+<wbr />3*4+7*2+3*3+2*4+1*6+1<wbr />*6+1*5=123 бит
Длина кодированного сообщения равна 123 бит:
11101111001111110111<wbr />001101010001110011101<wbr />0110111000011000000
10011011111001110100<wbr />110010101010001110010<wbr />010111011100101101100<wbr />0
Анализ сжатия фразы:КОРОЛЕВА КАВАЛЕРУ ПОДАРИЛА КАРАВЕЛЛУ
Длина исходного сообщения 36 байт или 288 бит в ASCII:
сообщение содержит 12 различных символов.
Длина кода одного символа при равномерном кодировании равна log₂(12)=4 бит
при равномерном кодировании длина текста равна 36*4=144 бит
Коэффициэнты сжатия
по отношению к восьмибитному коду К=288/123=~2.34
по отношению к равномерному коду минимальной длинны К=144/123=~1.17