Добавлен: 27.06.2023
Просмотров: 191
Скачиваний: 2
Во время кодирования создается в первую очередь последняя группа, затем предпоследняя и далее до тех пор, пока процесс не будет окончен. При обратном процессе – декодировании, наоборот, начинается процесс с первой группы, далее по значению битов считывается вторая и так далее. При нулевом значение второй, либо последующих групп выводится итоговое значение.
Рассматриваемые виды кодов могут быть действенны в определенных ситуациях:
- Вероятности чисел убывают с ростом значений элементов и их распределение близко к P(x)≥P(x+1), при любом x. Точнее маленькие числа встречаются чаще больших.
- Диапазон значений входных элементов не ограничен или неизвестен. Например, при кодировании 32-битовых чисел реально большинство чисел маленькие, но могут быть и большие.
- При использовании в составе других схем кодирования, например, кодирование длин серий.
2.3 Кодирование длин серий
Метод кодирования информации, известный как метод кодирования длин серий, его предложил П. Элиасом, при построении использует коды целых чисел [6]. Входным потоком для кодирования является последовательность из нулей и единиц. Идея кодирования заключается в кодирование последовательности одинаковых элементов, к примеру, нулей. Последовательность одинаковых элементов называется серией, количество элементов в ней – длиной серии.
Желательно рассмотреть пример:
Исходную последовательность (общая длина 31бит) можно разбить на серии, а затем закодировать их длины.
000000 1 00000 1 0000000 1 1 00000000 1
Используется, например, γ-код Элиаса. Поскольку в коде нет кодового слова для нуля, то придется кодировать длину серии +1, точнее последовательность 7 6 8 1 9:
7 6 8 1 9 ⇒ 00111 00110 0001000 1 0001001
Длина полученной кодовой последовательности равна 25 бит.
Метод длин серий эффективен для кодирования данных, имющие длинные последовательности одинаковых бит.
Глава 3. Адаптивные методы кодирования
Адаптивные модификации методов кодирования применяют в том случае, когда при решении реальных задач истинные значения вероятностей источника, в большинстве случаев, неизвестны или могут изменяться с течением времени. Многие адаптивные методы для учета изменений исходных данных используют окно – это последовательность символов, предшествующих кодируемой букве [7]. А количество символов в этом окне называют длиной окна. Окно имеет фиксированную длину и передвигается вправо на одну единицу после каждой буквы. Из этого выходит, что для одной буквы код строится с учетом информации из окна. На рисунке 2 показ этот процесс.
кодируемый символ
... a3 a2 a5 a2 a4 a1 a1 a3 a2 a2 a2 a4 a3 a1 a2 ...
... a3 a2 a5 a2 a4 a1 a1 a3 a2 a2 a2 a4 a3 a1 a2 ...
кодируемый символ
... a3 a2 a5 a2 a4 a1 a1 a3 a2 a2 a2 a4 a3 a1 a2 ...
кодируемый символ
Рисунок 2 – Схема перемещения окна при кодировании
Во время декодирования окно ведет себя аналогичным образом. С помощью информации в окне происходит декодирование нужного символа.
При рассматриваемом методе кодирования оценка избыточности становится непростой математической задачей, так как избыточность состоит из двух компонентов:
- Избыточности копирования;
- Избыточности, возникающей при рассмотрении оценки вероятностей появления символов.
Благодаря этим параметрам действенность методов адаптивного кодирования обычно определяют экспериментальным путем.
Для всех методов адаптивного кодирования существует следующая теорема: Величина средней длины кодового слова при адаптивном кодировании удовлетворяет неравенству Lcp ≤ H+C,
где Н – энтропия источника информации, C – константа, которая зависит от размера алфавита источника и длины окна.
3.1 Адаптивный код Хаффмана
Метод кодирования источников с меняющейся статистикой был предложен Р. Галлагером в 1978 г., и был основан на коде Хаффмана, поэтому и получил название «Адаптивный код Хаффмана» [8].
Рассматриваемый код используется во многих методах сжатия данных в роли составной части. Кодирование происходит на основе информации из окна длины W. Алгоритм представляет собой ряд действий:
- Перед началом кодирования очередной буквы подсчитывается частота появления в окне всех символов исходного алфавита А= {a1, a2, ..., an}. Допустимо обозначить эти частоты как q(a1), q(a2), ..., q(an). Вероятности символов исходного алфавита оцениваются на основе значений частот символов в окне
P(a1) = q(a1)/W, P(a2) =q(a2)/W, ..., P(an)= q(an)/W.
- По полученному распределению вероятностей строится код Хаффмана для алфавита А.
- Очередная буква кодируется при помощи построенного кода.
- Окно передвигается на один символ вправо, вновь подсчитываются частоты встреч в окне букв алфавита, строится новый код для очередного символа, и так далее, пока не будет получен код всего сообщения.
Здесь можно привести пример адаптивного кодирования с помощью метода Хаффмана для алфавита А= {a1, a2, a3, a4} и длины окна W=6.
кодируемый символ
... a1 a2 a1 a1 a3 a4 a3 a3 a2 ...
... a1 a2 a1 a1 a3 a4 a3 a3 a2 ...
кодируемый символ
... a1 a2 a1 a1 a3 a4 a3 a3 a2 ...
кодируемый символ
Рисунок 3 – Кодирование адаптивным кодом Хаффмана
При кодировании буквы a3 получается следующие частоты встреч символов в окне: q(a1) =3, q(a2) =1, q(a3) =1, q(a4) =1. Тогда вероятности символов алфавита A оцениваются так
P(a1)= , P(a2)= , P(a3)= , P(a4)= .
На рисунке 4а) построен код Хаффмана для полученного распределения вероятностей и кодируется символ а3 с помощью кодового символа 001.
a)
Символы |
Вероятности |
Построение кода |
Кодовые слова |
а1 |
1/2 |
1 |
1 |
а2 |
1/6 |
1/2 0 |
01 |
а3 |
1/6 |
1/3 |
001 |
а4 |
1/6 |
000 |
б)
Символы |
Вероятности |
Построение кода |
Кодовые слова |
а1 |
1/3 |
1 |
1 |
а2 |
1/6 |
1/3 2/3 0 |
011 |
а3 |
1/3 |
00 |
|
а4 |
1/6 |
010 |
в)
Символы |
Вероятности |
Построение кода |
Кодовые слова |
а1 |
1/3 |
1/2 1 |
11 |
а2 |
0 |
1/6 0 |
101 |
а3 |
1/2 |
0 |
|
а4 |
1/6 |
100 |
Рисунок 4 – Построение адаптивного кода Хаффмана
На следующем шаге окно сдвигается на один знак вправо и обновляется подсчет частоты встреч символов в окне q(a1) = 2, q(a2) = 1, q(a3) = 2, q(a4) = 1 и оценивается вероятность:
P(a1)= , P(a2)= , P(a3)= , P(a4)= .
Далее происходит построение кода на основе полученного результата вероятного распределения, что представлено на рисунке 4б), кодируется символ а3 кодовым словом «00». Следует увеличение частоты встречи символа а3, соответственно длина кодового слова уменьшилась.
После окно снова движется вправо на один символ, что приводит к изменению частоты символов в окне q(a1)=2, q(a2)=0, q(a3)=3, q(a4)=1. Происходит оценка вероятности: P(a1)= , P(a2)=0 , P(a3)= , P(a4)= .
На рисунке 4в) представлен код, построенный на основе полученных оценок вероятностей. Происходит кодирование символа а2 кодовым словом 101. В итоге выходит кодовая последовательность 00100101.
Алгоритм на псевдокоде с помощью адаптивного кода Хаффмана:
Обозначение:
w – окно;
mas – массив вероятностей символов и кодовых слов.
DO (i=1,…n) w[i]:=a[i] OD \\заполнение окна символами алфавита
DO (not EOF) \\ до конца входного файла
DO (i=1,…,n) mas[i].p:=0 OD
DO (i=1,…,n) mas[w[i]].p:= mas[w[i]].p +1 OD \\частоты встречи
символов в окне
DO (i=1,…,n) mas[w[i]].p:= mas[w[i]].p/n OD \\вероятности символов
в окне
Сортировка(mas)
DO (i=1,…,n) \\определение количества
IF (mas[i].p=0) OD ненулевых вероятностей
OD
Huffman(i,P) \\построение кода Хаффмана
C:=Read( ) \\чтение следующий символ из файла
Write(mas[C].code) \\код символа – в выходной файл
DO (i=1,…,n-1) w[i]:= w[i+1] OD
w[n]:=C \\включение в окно текущего символа
OD
3.2 Код «Стопка книг»
Метод «Стопка книг» был предложен Рябко Б.Я. в 1980 г. Благодаря аналогии со стопкой книг, код получил свое название [9]. Чем раньше использовалась книга, тем выше она лежит, и каждый раз использованная книга кладется сверху.
До процедуры кодирования буквы исходного алфавита находятся на произвольных местах, также каждой позиции присвоено свое кодовое слово, причем на первой позиции находится самое короткое кодовое слово, соответственно на последней − самое длинное слово. Кодирование очередного символа производится следующим образом: символ кодируется словом, которое соответствует его продолжения в сторонке в текущий момент, а затем переставляется с начало стопки.
Описание кода можно представить с помощью алфавита A={a1, a2, a3, a4}. Пусть кодируется сообщение а3а3а4а4а3.
- Символ а3 находится в третьей позиции стопки, кодируется кодовым словом 110 и перемещается на первую позицию, при этом символы а1 и а2 смещаются на одну позицию вниз.
- Следующий символ а3 уже находится в первой позиции стопки, кодируется кодовым словом 0, и стопка не изменяется.
- Символ а4 находится в последней позиции стопки, кодируется кодовым словом 111 и перемещается на первую позицию в стопке, при этом символы а1, а2, а3 смещаются на одну позицию вниз.
- Следующий символ а4 уже находится в первой позиции стопки, кодируется кодовым словом 0, и стопка не изменяется.
- Символ а3 находится во второй позиции стопки, кодируется кодовым словом 10 и перемещается на первую позицию в стопке, при этом символ а4 смещается на одну позицию вниз.
№ |
Кодовое слово |
Начальная «стопка» |
Преобразования «стопки» |
||||
1 |
0 |
а1 |
а3 |
а3 |
а4 |
А4 |
а3 |
2 |
10 |
а2 |
а1 |
а1 |
а3 |
А3 |
а4 |
3 |
110 |
а3 |
а2 |
а2 |
а1 |
А1 |
а1 |
4 |
111 |
а4 |
а4 |
а4 |
а2 |
А2 |
а2 |
Рисунок 5− Кодирование методом «стопка книг»
Таким образом, закодированное сообщение имеет следующий вид:
110 0 111 0 10 …
а3 а3 а4 а4 a3
Метод, описанный выше, сжимает сообщения за счет часто встречающихся символов, которые находятся в верхних позициях «стопки» и кодирует и более короткими словами. Метод особенно эффективен при наличии серий одинаковых символов. В таком случае все символы серии, начиная со второго, будут кодироваться самым коротким кодовым словом.
Декодирование происходит по тому же принципу «стопки книг». При этом процессе производятся те же операции, что и при кодировании. Что позволяет восстановить, в случае необходимости, исходную последовательность.