Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

681_Trofimov_V.K._Teoremy_kodirovanija_neravnoznachnymi_

.pdf
Скачиваний:
5
Добавлен:
12.11.2022
Размер:
2.19 Mб
Скачать

Замечание. Вместо буквы x4 на данном шаге могла быть выбрана буква x3

с такой же вероятностью. При присвоении меток можно было бы поменять их местами: π (x4, x6) = 1, π (x5, x6) = 0. При построении кода это не важно, так как не влияет на эффективность кодирования, а именно, на среднюю длину ко-

дового слова.

.

Рис. 3.

На втором шаге построения кода (рис. 4), работая уже с алфавитом

x1, x2 , x3, x6 , выбираем буквы x3, x6 , удаляем их из алфавита, заменяя на букву x7 с вероятностью p(x7) = 0.4. Вершины кодового дерева, соответствующие бук-

вам x3, x6 , соединяем ребрами с вершиной, соответствующей x7 . Метки ребер:

Рис. 4.

21

На третьем шаге (рис. 5), удаляем из алфавита x1, x2 , x7 буквы x1, x2 ,

вводя букву x8 , где полагаем p( x8 ) = 0.6. Добавляем к кодовому дереву ребра

x1, x8 и x2 , x8 с метками

Рис. 5.

На четвертом, последнем, шаге (рис. 6) заменяем две оставшиеся буквы x7 , x8 на букву x9, p(x9) = 1. Добавляем к кодовому дереву ребра ( x7 , x9 ) и ( x8 , x9 ) с метками

Рис. 6.

22

Запишем кодовые слова для букв исходного алфавита (табл. 2).

Табл. 2.

2.2. Арифметическое кодирование

Одним из наиболее известных алгоритмов сжатия данных является арифме-

тическое кодирование [12, 17, 39, 40, 55, 56, 66]. Сообщения источника коди-

руются вещественным числом из полузакрытого слева единичного интервала.

Каждый следующий символ сообщения источника сужает выбираемый интер-

вал согласно закону распределения вероятности появления символа в сообще-

нии. После окончательного определения интервала, соответствующего слову источника, остается число, определяющее код сообщения: двоичная запись числителя дроби, принадлежащей данному интервалу, знаменатель которой яв-

ляется наименьшей возможной степенью двойки.

Идея арифметического кодирования была предложена П. Элайесом, опи-

сана Н. Абрамсоном в 1963 г. [33] и усовершенствована Й. Риссайненом

[55, 56].

Пусть заданы алфавит X x1, x2 ,..., xk и закон распределения p. Упоря-

дочим все слова источника лексикографически. Разобьем интервал [0; 1) на по-

лузакрытые слева интервалы

На каждом интервале Ii выберем правильную дробь

bi

Ii с наименьшим воз-

 

 

 

 

 

2ki

можным значением k

. Кодовое слово для

w X *

состоит из двоичной записи

i

 

i

 

 

 

числа bi :

23

Пример выполнения арифметического кодирования.

Рассмотрим множество слов над алфавитом X a; b; c; d бернулли-

евского источника. Пусть задана вероятность появления символов алфавита в сообщениях: p a 0.3; p b 0.4; p c 0.1; p d 0.2.

Определим кодовое слово для сообщения "adcc".

Для этого разобьем единичный интервал на четыре интервала, соответ-

ствующих буквам алфавита (по порядку):

[0;1) = [0;0.3) [0.3;0.7) [0.7;0.8) [0.8;1).

Выберем интервал, соответствующий первой букве сообщения "a": a [0; 0.3).

Разобьем интервал [0; 0.3) на четыре интервала, соответствующих буквам ал-

фавита, масштабируя предыдущее разбиение [0; 1):

[0;0.3) = [0;0.09) [0.09;0.21) [0.21;0.24) [0.24;0.3).

Выберем интервал, соответствующий второй букве сообщения "d": ad [0.24; 0.3).

Разобьем интервал [0.24; 0.3) на четыре интервала, соответствующих буквам алфавита, масштабируя предыдущее разбиение:

0.24; 0.3 0.24; 0.24 0.018 0.24 0.018; 0.24 0.042

0.24 0.042;0.24 0.048 0.24 0.048;0.24 0, 06 ;

0.24;0.3 0.24;0.258 0.258;0.282 0.282; 0.288 0.288; 0.3 .

Выберем интервал, соответствующий третьей букве сообщения "c": adc [0.282; 0.288).

Разобьем интервал [0.282; 0.288) на четыре интервала, соответствующих бук-

вам алфавита, масштабируя предыдущее разбиение:

0.282;0.288 0.282;0.282 0.0018 0.282 0.0018;0.282 0.00420.282 0.0042;0.282 0.0048 0.282 0.0048;0.282 0.006 ;

0.282;0.288 0.282;0.2838 0.2838;0.2862 0.2862; 0.2868 0.2868; 0.288 .

Выберем интервал, соответствующий четвертой букве сообщения "c":

24

adcc [0.2862;0.2868).

Выберем правильную дробь с наименьшим возможным знаменателем степени числа 2:

0.2862 587211 0.2868 ,

и представим в двоичной записи:

29 26 23 21 20

0.01001001011.

211

 

Рис. 7.

Итак, φ(adc)=01001001011.

Иллюстрация арифметического кодирования дана на рис.7.

Арифметическое кодирование широко используется при сжатии изображений,

втом числе и видео. Модификации арифметического кодирования предложены

вработах И. Уиттена [66], Б.Я. Рябко [16] и Ю.М. Штарькова [30].

25

2.3. Код Лемпела-Зива

Код Лемпела-Зива (LZ), предложенный в 1977-78 гг. [67, 68], относится к словарным методам кодирования. В процессе просмотра текста создается сло-

варь из закодированных последовательностей, расширяющийся по мере про-

смотра текста.

Базовая идея схемы Лемпела-Зива заключается в следующем.

Просматриваем последовательность символов w xi1 xi2 · · · xin алфавита

X x1, x2 ,..., xk до тех пор, пока не встретим повторяющийся символ:

Просматривая последовательность далее, выделим максимальный по длине префикс (подслово), который уже встречался в предыдущем тексте

Добавим данный префикс в качестве нового слова к "словарю". При этом при-

своим новому слову двойную метку, состоящую из

1)номера позиции первого символа самого раннего вхождения данного слова в текст;

2)количества букв в обрабатываемом слове:

Продемонстрируем данную схему на примере, закодировав слово "abrabarabra".

1)abrabarabra → (a)brabarabra;

2)(a)brabarabra → (ab)rabarabra;

3)(ab)rabarabra → (abr)abarabra;

4)(abr)abarabra → (abr)(1, 2)arabra; буква "a" уже встречалась ранее: "a" –

первый символ последовательности; добавляем в словарь "ab" слово длины два,

следовательно, вместо слова "ab" оставляем метку (1,2);

26

5) (abr)(1, 2)arabra → (abr)(1, 2)(1, 1)rabra; буква "a" уже встречалась ра-

нее: "a" – первый символ последовательности; добавляем в словарь "a" одно-

буквенное слово, следовательно, вместо слова "a" оставляем метку (1,1);

6) (abr)(1, 2)(1, 1)rabra → (abr)(1, 2)(1, 1)(3, 3)ra; буква "r" встречалась ра-

нее (третий символ входной последовательности); добавляем в словарь "rab" ,

оставляем метку (3,3);

7) (abr)(1, 2)(1, 1)(3, 3)ra → (abr)(1, 2)(1, 1)(3, 3)(3, 2), добавляем в словарь

"ra", оставляем метку (3,2).

В версии LZ77 вводится два параметра: длина скользящего "окна", охва-

тывающего последовательность, и максимальная длина последовательности в словаре. При этом рассматриваемым подсловам ставятся в соответствие трой-

ные метки, состоящие из указателя на смещение слова в словаре, длины нового подслова и последующей за ним буквы. Используем в качестве примера слово

"abrabarabra" и закодируем его посредством LZ77 с длиной окна, равной 6, и

размером словаря 4 (табл. 3).

словарь

оставшаяся часть окна

кодовая "тройка"

 

 

 

- - - -

ab

(0,0,a)

 

 

 

- - - a

br

(0,0,b)

 

 

 

- - a b

ra

(0,0,r)

 

 

 

- a b r

ab

(1,2,a)

 

 

 

Табл. 3.

На четвертом символе обнаружено совпадение: смещение буквы "a" относи-

тельно начала окна равно 1, длина совпадающего подслова 2. После создания первых двух кодовых символов окно смещается на две ячейки вправо. Следу-

ющая буква "a" (табл. 4)

словарь

оставшаяся часть окна

кодовая "тройка"

 

 

 

b r a b

ar

(2,1,r)

 

 

 

Табл. 4.

27

Обнаружено совпадение со словарем: смещение буквы "a" относительно начала окна 2, длина совпадающего подслова 1. Окно смещается вправо на одну ячей-

ку. Следующая буква "r" (табл. 5).

словарь

оставшаяся часть окна

кодовая "тройка"

 

 

 

r a b a

ra

(0,2,b)

 

 

 

Табл. 5.

Обнаружено совпадение со словарем: смещение буквы "r" относительно начала окна отсутствует, длина совпадающего подслова 2. Окно смещается на две ячейки вправо. Следующая буква "b" (табл. 6).

словарь

оставшаяся часть окна

кодовая "тройка"

 

 

 

b a r a

br

(0,1,r)

 

 

 

a r a r

ra

(1,2,a)

 

 

 

Табл. 6.

Длину буфера (оставшейся от словаря части окна), очевидно, не имеет смысла делать больше, чем длину словаря. Закодируем "abrabarabra" посредством LZ77

с длиной окна, равной 8, и размером словаря 4 (табл. 7).

словарь

оставшаяся часть окна

кодовая "тройка"

 

 

 

- - - -

abra

(0,0,a)

 

 

 

- - - a

brab

(0,0,b)

 

 

 

- - a b

raba

(0,0,r)

 

 

 

- a b r

abar

(1,2,a)

 

 

 

b r a b

arab

(0,1,r)

 

 

 

r a b a

rabr

(0,3,r)

 

 

 

a r a b

ra - -

(1,2,a)

 

 

 

Табл. 7.

В версии LZ78 словарь изначально содержит все буквы алфавита и при просмотре текста расширяется посредством добавления новых слов, которые получаются из уже имеющихся добавлением новых букв в конец слова.

28

При этом для нового слова формируется двойная метка, состоящая из ссылки-указателя на слово в словаре и добавляемой к этому слову буквы.

Закодируем "abrabarabra", используя LZ78 (табл. 8).

словарь

оставшаяся часть окна

кодовая "двойка"

 

 

 

 

 

(a)brabarabra

 

a

 

(0, a)

 

 

 

 

 

a(b)rabarabra

 

a, b

 

(0, b)

 

 

 

 

 

ab(r)abarabra

a,

b, r

 

(0,r)

 

 

 

 

 

 

abr(ab)arabra

a,

b,

r, ab

 

(1, b)

 

 

 

 

 

abrab(ar)abra

a b,

r,

ab, ar

(1,r)

 

 

 

 

 

abrabar(abr)a

a, b, r,

ab, ar,

abr

(4,r)

 

 

 

 

 

abrabarabr(a)

a, b, r,

ab, ar,

abr

(0, a)

 

 

 

 

 

 

Табл. 8.

Существует множество модификаций LZ-схемы, подробный обзор по

этой теме содержится, например, в [34].

3.Кодирование известного источника неравнозначными символами

3.1.Предварительные построения

Рассмотрим кодовый алфавит Y y1, y2,..., ym c вектором длительно-

стей кодовых символов tY t1,t2 ,...,tm . Пусть 0 tY – наибольший положи-

тельный корень уравнения

t1 t2 .. tm 1.

Определим разбиение произвольного интервала

a;b , которое будет играть

важную роль в построении оптимального кодирования.

 

Определение 3.1.1. Разбиение

 

 

 

 

 

Y a;b I j a;b

 

 

 

,

(3.1)

j 1,m

 

 

 

которое состоит из m непересекающихся интервалов I j a;b определяется

следующим образом:

29

 

 

 

 

 

I j a;b a j 1;a j ,

 

 

 

 

n

 

 

 

(3.2)

an a (b a) 0 ti ,

n 1, m,

a0 a,

am b.

 

i 1

Утверждение. Длина интервала I j a;b обратно пропорциональна дли-

тельности буквы y j .

Доказательство. В самом деле, согласно определению разбиения полу-

чаем:

I j a;b

 

 

j

t

j 1

t

 

b a

 

 

 

 

a j a j 1

(b a)

0

i 0

i

 

 

.

0t j

 

 

i 1

 

i 1

 

 

 

 

 

 

 

 

 

 

Утверждение доказано.

Через Yn a;b обозначим разбиение, полученное n-кратным примене-

нием процедуры разбиения Y a;b к интервалу a;b , т.е. «разбиение разби-

ений»:

Yn

a;b I j

j ... j a;b

ji

 

 

 

 

 

 

 

 

,

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

2

n

 

1,m,i 1,n

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

... j a;b I j

I j

...I j

I j

a;b .

 

 

(3.3)

I j

j

 

 

 

1

2

n

 

n

n 1

 

2

 

 

1

 

 

 

 

 

 

 

 

 

 

По определению 1Y a;b Y a;b .

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Значение n в дальнейшем будем называть глубиной разбиения Yn a;b .

Как следует из определения Yn a;b ,

всегда выполняются следующие соот-

ношения:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

I j j ... j

a;b I j

j ... j

 

 

a;b ,

 

 

 

(3.4)

 

 

 

1 2

n

 

 

 

1

2

 

n 1

 

 

 

 

 

 

 

Yn a;b

 

 

Yn 1 a j

j ... j

 

 

;a

j j ... j

 

1

.

(3.5)

 

 

 

 

 

 

 

 

1

2

 

 

n 1

 

 

 

 

 

 

 

1,2,...,m n 1

 

 

 

 

 

 

 

 

 

 

1 2 n

1

 

 

 

 

 

j j ... j

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1 2

n 1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Пример построения разбиений отрезка [0;1). Пусть задан бинарный ко-

довый алфавит и известны длительности кодовых символов t(0)=1 и t(1)=8.

Приближенное значение корня уравнения 1 8 1 равно

1,232. Зная

 

 

 

 

 

 

0

 

0

, вычислим 1

0,81

и 8

0,19. Таким образом,

 

 

0

 

0

 

 

 

 

 

 

 

30