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

pri_cod2

.pdf
Скачиваний:
6
Добавлен:
27.05.2015
Размер:
585.25 Кб
Скачать

На первом шаге можно положить

S0 = f22; 20g и S1 = f15; 11; 10; 9; 7; 6g;

поскольку суммы 22 + 20 = 44 и 15 + 11 + 10 + 9 + 7 + 6 = 56 сравнительно мало отличаются друг от друга. Теперь полагаем

S00 = f22g; S01 = f20g; S10 = f15; 11g и S11 = f10; 9; 7; 6g;

S100 = f15g; S101 = f11g; S110 = f10; 9g; S111 = f7; 6g:

Наконец, полагаем

S1100 = f10g; S1101 = f9g; S1110 = f7g; S1111 = f6g:

Соответствующая схема кодирования выглядит так:

8 a1

¡

00;

a2

¡

01;

a3

¡

100;

a4

¡

101;

< a5

¡

1100;

a6

¡

1101;

a7

¡

1110;

a8

¡

1111:

:

 

 

 

 

 

 

 

Избыточность этой схемы равна 2:9.

Несложная модификация алгоритма Шеннона-Фано позволяет строить тернарные, четверичные и т. д. коды. Пусть выходной алфавит B содержит

q> 2 символов. Тогда надо строить части A = Aj1j2:::jm алфавита A, где j1; j2; : : : ; jm 2 Zq = f0; 1; 2; : : : ; q ¡ 1g, и каждую такую часть разбивать на q, если jAj ¸ q, или на одноэлеменные подмножества, если 2 · jAj < q.

Пример 8. Построим троичный код до набору вероятностей упражнения 1. Сначала полагаем

A = f22; 20; 15; 11; 10; 9; 7; 6g:

Затем разбиваем A на три части

A0 = f22; 11g; A1 = f20; 7; 6g и A2 = f15; 10; 9g:

Суммы относительных частот по этим частям приблизительно равны друг другу: 22 + 11 = 33, 20 + 7 + 6 = 33 и 15 + 10 + 9 = 34. Теперь полагаем

A00 = f22g; A01 = f11g;

11

A10 = f20g; A11 = f7g; A12 = f6g;

A20 = f15g; A21 = f10g; A22 = f9g:

Приходим к такой схеме кодирования:

8 a1

¡ 00; a2

¡ 10; a3

¡ 01; a4

¡ 20;

< a5

¡

21; a6

¡

22; a7

¡

11; a8

¡

12:

:

 

 

 

 

Избыточность этой схемы равна 2.

Решение последнего примера упрощается, если строитьдерево разбиений:

 

 

 

 

 

 

 

©

©

©©©©

f22g

a0

 

 

 

 

f22; 11g

 

 

 

 

f11g

a4

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

½½

½½½½

 

©©

©©©©

f20g

a2

 

 

 

 

A

 

f20; 7; 6g

 

 

 

 

f7g a7

 

ZZ

 

HHH

HHH

 

 

 

ZZZZ

 

 

 

f6g

a8

 

 

 

 

f15; 10; 9g

H

 

 

 

 

 

f15g a3

 

 

 

 

@H@HHH

 

 

 

 

 

 

 

 

@

@

H

f10g

a5

 

 

 

 

 

 

 

 

 

@@

 

 

 

 

 

 

 

 

 

 

f9g

a6

 

 

 

 

 

 

 

 

 

 

 

1.4.2Метод Хаффмана

Этот метод позволяет получить точное решение задачи, то есть построенный по алгоритму Хаффмана код всегда оптимален. Важную роль при обосновании алгоритма играет дерево префиксного кода.

Пусть задана схема алфавитного кодирования (§) с входным алфавитом A и выходным алфавитом B, состоящим, соответственно, из r и q символов. Пусть схема обладает свойством префикса. Дерево T этого кода имеет корень, то есть выделенную вершину, которую на рисунке обычно располагают вверху. В этом дереве нет горизонтальных ребер. Если a верхняя вершина некоторого ребра, а b его нижняя вершина, то говорят, что a отец вершины b, а b сын вершины a. Сыновья одного отца называются братьями.

Число сыновей вершины называют порядком ветвления этой вершины. Вершины, не имеющие сыновей, называют концевыми вершинами; число концевых вершин

12

равно r и каждая такая вершина имеет метку, которой служит один из символов входного алфавита A. При этом разные концевые вершины имеют разные метки.

Кроме того, каждое ребро дерева T помечено некоторым символом выходного алфавита B, причем если два ребра имеют общую вершину, то их метки различны. Выполнено также следующее свойство:

Eсли концевой вершине v приписан символ ai 2 A, то код этого символа является набором меток ребер на пути из корня дерева в вершину v.

Вершины, являющиеся сыновьями корня, называют вершинами первого яруса. Сыновья вершин первого яруса образуют второй ярус и т.д. . Ясно, что номер яруса, в котором располагается вершина v, равен числу ребер пути, который ведет из корня дерева в вершину v. Eсли концевая вершина v помечена символом ai и находится в ярусе с номером m, то длина li кодового слова Bi в схеме кодирования (§) равна m.

Пример 9. Деревья кодов из примера 1 и из упражнения 1 представлены на следующем рисунке:

 

 

¶Ss

S

2

 

 

 

 

 

 

 

 

 

1

 

 

¢¢AsA

 

4

 

 

 

 

 

 

0

1

 

 

 

 

 

 

 

 

 

 

¢

3

 

 

A

 

 

 

 

 

 

 

 

 

 

 

S

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

¤s

 

S

 

 

 

 

 

 

 

 

 

¢

 

 

as

 

 

A

sA

 

 

 

 

 

 

SS

 

 

 

 

 

 

 

 

¢¢

 

 

 

 

AA

 

 

 

 

s

 

 

 

¤As

A

 

 

 

 

 

 

 

¡¢As

 

 

 

2

 

 

 

 

 

1

 

0

¤

 

 

¤

 

 

 

 

 

¡¢ A

 

4

 

 

 

1

A

 

2

 

 

 

 

 

1¤

2

 

 

 

1¡2

¢

3

A

 

 

 

 

A

 

 

 

 

¤

 

 

 

 

A

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

¤

 

 

 

¤

A

 

 

 

¡

 

¢

 

¢As

 

 

A

 

 

 

 

 

A

s

 

 

¤

 

 

 

 

¤

 

AA

¡¡

¢¢

 

 

 

 

AA

 

 

 

 

 

AA

 

s

 

 

 

 

¢

 

 

s

as3

as

4

 

 

 

 

as6

 

as7

 

 

a

b

 

 

 

0¢¢

 

1

 

 

 

 

2¢¢ AA 3

 

 

 

 

 

3

 

ГрафN11

¢

 

 

 

 

 

 

 

¢

 

 

 

 

A

 

 

 

 

 

 

 

 

 

 

 

¢

 

 

 

 

 

 

¢¢

 

 

 

 

 

AA

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

s

 

as

1

 

 

 

 

 

as8

 

 

 

 

as5

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

c

 

 

 

d

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

"Дерево кода из примера ..."

Дерево кода можно построить и для кодов, не обладающих свойством префикса. Однако тогда придется помечать символами входного алфавита не только конечные, но и промежуточные вершины дерева. Например, для азбуки Морзе первый ярус дерева состоит из двух вершин с метками Т и Е

13

(их коды “¡ “, “¢ “), второй ярус состоит из четырех вершин с метками И, А, Н, М (коды “ ¢ ¢ “, “¢ ¡ “ , “¡ ¢ “ и “ ¡ ¡ “) и т.д. .

Лемма 2 Пусть (§) схема кода с минимальной избыточностью. Тогда выполнены следующие свойства:

(1)Если pi < pj, то li ¸ lj. Следовательно, вершина дерева кода с меткой ai находится не ниже, чем вершина с меткой aj.

(2)Порядок ветвления каждой вершины дерева кода равен q или 0 кроме, быть может, одной вершины предпоследнего яруса, порядок ветвления q0 которой меньше 2 и не больше q.

Доказательство леммы можно найти в [Ябл., стр.] Деревья, удовлетво- N ряющие условию (2) называются насыщенными.

Метод Хаффмана заключается в последовательном уменьшении числа вершин дерева кода за счет "склеивания"некоторых вершин (при склейке концевых вершин склеиваются и соответствующие им символы входного алфавита A). Склеиваться могут только концевые верши-ны, соответствующие (всем) сыновьям некоторой вершины дерева.

Будем считать, что символы входного алфавита A упорядочены по убыванию вероятностей их появления в кодируемом тексте, то есть выполнено условие

p1 · p2 · p3 · : : : · pr:

Тогда вершина с меткой ar лежит в последнем ярусе дерева кода. лемме 2 у этой вершины есть не менее одного брата. Несложно проверить, что избыточность кода не изменяется при перестановке меток вершин одного яруса дерева кода. Поэтому считаем, что все братья вершины с меткой arэто вершины с метками ak+1, ak+2, : : :, a1.

Пусть символы ak+1, ak+2, : : :, ar в схеме (§) склеиваются в один символ ®. Тогда возникает новая схема кодирования (§0). Пусть T и T 0 деревья схем (§) и (§0) соответственно. Тогда в дереве T 0 есть конечная вершина v0 с меткой ®. Ясно, что дерево T получается из дерева T 0 путем добавления

14

к вершине v0 новых ребер (идущих вниз) в количестве q0 = r ¡ k. Положим p = pk+1 + pk+2 + : : : + pr.

Пусть вершина ® лежит в ярусе дерева T 0 с номером m. Тогда символы ak+1, ak+2, : : :, ar лежат в ярусе с номером m + 1 дерева T . Поэтому код символа ® (в схеме (§0)) имеет длину m, а коды символов ak+1, ak+2, : : :, ar (в схеме (§)) длину m + 1. Коды же символов ak, a2, : : :, ak одинаковы в схемах (§) и (§0). Отсюда

 

r

 

l(§) ¡ l0) =

i=X

((pi ¢ (m + 1)) ¡ pm = p(m + 1) ¡ pm = p:

k+1

 

 

Теперь несложно сделать вывод, что схема (§) оптимальна для чисел r, q и вектора вероятностей P = (p1; p2; : : : ; pr) тогда и только тогда, когда схема (§0) оптимальна для чисел k + 1, q и вектора вероятностей P0 = (p1; p2; : : : ; pk; p). Этот факт называют теоремой редукции (см. [....], стр ....).

Теорема редукции сводит задачу о построении оптимального кода к такой же задаче, но с меньшим числом символов входного алфавита. Если последняя задача все же сложна, то снова проводят склейку символов и так до тех пор, пока число символов не станет меньшим либо равным q. В этом случае решение очевидно кодовыми словами будут отдельные символы выходного алфавита B. Получив решение в этом случае, можно, последовательно расклеивая ранее склеенные символы, построить оптимальную схему для исходного алфавита.

Возникает, однако, некоторая сложность: мы не знаем сколько символов склеивалось на каждом шаге. Пусть q0 число таких символов. В исходном дереве T число концевых вершин равно числу символов входного алфавита, то есть r. После склейки q0 символов исчезло q0 концевых вершин, но зато появилась новая концевая вершина ®. Поэтому в дереве T 0 число концевых вершин равно r ¡ (q0 ¡ 1). Из леммы 1 легко заключить, что в дереве T 0 порядок ветвления любой вершины равен 0 или q. Поэтому при второй, третьей и последующих склейках склеивать придется ровно q вершин. При каждой такой склейке число концевых вершин умеьшается на (q ¡ 1). Пусть после t склеек число r0 концевых вершин дерева не больше q. По лемме 1 верно

15

равенство r0 = q. Приходим, таким образом к равенству

r ¡ (q0 ¡ 1) ¡ (q ¡ 1)(t ¡ 1) = q;

из которого получаем r = (q ¡ 1)t + q0. Доказана, таким образом,

Лемма 3 Число q0 при некотором целом неотрицательном t удовлетворяет равенству r = (q ¡ 1)t + q0, а также двойному неравенству 2 · q0 · q.

Пример 10. Найдем число q0 символов, которые надо склеить на первом шаге при построении пятеричного кода, если входногй алфавит содержит 255 символов. По условию r = 255 и q = 5, поэтому по лемме... 255 = (5 ¡ 1)t + q0 и 2 · q0 · 5 при некотором целом неотрицательном t. Этим требованиям удовлетворяет единственная пара t = 63, q0 = 3. Следовательно, на первом шаге надо склеить 3 символа. Отметим, что на следующих шагах надо склеивать по 5 символов.

Из леммы .... несложно получить следующий результат:

Лемма 4 Пусть числа r, q и q0 удовлетворяют условиям леммы.... Пусть s остатк при делении числа r на q ¡ 1. Тогда

8

>

> s , если s ¸ 2;

>

<

q0 = > q ¡ 1 , если s = 0;

>

:

> q , если s = 1

Как и в алгоритме Шеннона-Фано, в алгоритме Хаффмана вместо вероятностей pi можно рассматривать относительные частоты ki = ¸pi, где положительное число ¸ выбирают так, чтобы числа ki были бы целыми.

Напомним еще раз, что на втором, третьем и т.д. шагах надо склеивать по q символов с наименьшими частотами. При этом после каждой склейки следует набор относительных частот символов расположить по убыванию.

Пример 11. Построим оптимальный четверичный код по набору вероятностей из упражнения 1. По условию r = 8 и q = 4. Разделим с остатком r на q¡1: 8 = (4¡1)¢2+2. Остаток s = 2, поэтому по лемме... на первом шаге надо

16

склеить q0 = 2 символа. Выбрав ¸ = 100, выпишем список относительных частот:

f22; 20; 15; 11; 10; 9; 7; 6g:

Сложив два меньших числа, получим 7 + 6 = 13. После удаления из списка чисел 7, 6, добавления в список числа 13 и сортировки получим новый список:

f22; 20; 15; 13; 11; 10; 9g:

Сложив q = 4 числа справа получим: 13 + 11 + 10 + 9 = 43. Удалив из списка слагаемые и включив в список сумму, после сортировки получим такой список:

f43; 22; 20; 15g:

Теперь количество чисел в списке не превышает числа символов выходного алфавита. Поэтому склейки больше не нужны и можно строить дерево оптимального кода, а затем и схему кодирования:

8 a1

¡

1;

a2

¡

2;

a3

¡

3;

a4

¡

01;

< a5

¡

02;

a6

¡

03;

a7

¡

000;

a8

¡

001:

:

 

 

 

 

 

 

 

Избыточность этой схемы равна 1:56.

Ход решения удобно оформлять в виде таблицы:

 

 

 

 

 

 

 

 

 

X

 

k1

=

22

 

 

 

22

 

 

»

43

k2

=

20

 

 

 

20

 

 

 

22

k3

=

15

 

 

X

15

 

 

 

20

 

 

 

 

 

 

 

 

 

 

k4

=

11

 

 

»

13

 

 

 

15

k5

=

10

 

 

 

11

 

 

 

 

k6

=

9

 

 

 

10

 

 

 

 

k7

=

7

 

 

 

9

 

 

 

 

 

 

 

 

 

 

 

k8

=

6

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

17

соответствует та или иная относительная частота: это можно будует определить по меткам концевых вешин дерева кода. Поэтому в первом столбце в дальнейшем будем указывать только числовые данные.

Пример 12. Построим троичный и бинарный коды методом Хаффмана по набору вероятностей из упражнения 1.

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

 

 

 

 

X

 

 

 

X

 

22

 

22

 

»

30

 

»

48

20

 

20

 

 

22

 

 

 

30

15

X

15

 

 

20

 

 

 

22

 

 

 

 

 

 

 

 

 

 

 

 

 

 

11

»

13

 

 

15

 

 

 

 

10

 

11

 

 

13

 

 

 

 

 

 

 

 

 

 

 

910

7

 

9

 

6

 

 

 

 

 

 

 

 

 

Соответствующая схема кодирования выглядит так:

8 a1

¡

2;

a2

¡ 00; a3

¡

01;

a4

¡

10;

< a5

¡

11;

a6

¡

12; a7

¡

020;

a8

¡

021:

:

 

 

 

 

 

 

Избыточность этой схемы равна 1:91.

б) Бинарный код. На любом шаге надо склеивать два символа. Соответствующая таблица выглаядит так:

 

 

 

 

 

 

 

 

 

 

 

X

 

 

 

X

 

 

 

X

 

 

 

X

 

22

 

 

 

22

 

 

 

22

 

 

»

24

 

»

34

 

»

42

 

»

58

20

 

 

 

20

 

 

X

20

 

 

 

22

 

 

 

24

 

 

 

34

 

 

 

42

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

15

 

 

X

15

 

 

»

19

 

 

 

20

 

 

 

22

 

 

 

24

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

11

 

 

»

13

 

 

 

15

 

 

 

19

 

 

 

20

 

 

 

 

 

 

 

 

10

 

 

 

11

 

 

 

13

 

 

 

15

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

9

 

 

 

10

 

 

 

11

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

7

 

 

 

9

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

6

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

18

Приходим к такой схеме кодирования:

8 a1

¡

10;

a2

¡

11;

a3

¡

001;

a4

¡

011;

< a5

¡

0000;

a6

¡

0001;

a7

¡

0100;

a8

¡

0101:

:

 

 

 

 

 

 

 

Избыточность этой схемы равна 2:9.

19

1.5Сжатие данных

Под сжатием данных (англ. data compression) понимается такое преобразование, которое уменьшает объем данных, но позволяет восстановить исходные данные (возможно с потерями). Применяется для более рационального использования устройств хранения и передачи данных. Используют также термины “упаковка данных“, “компрессия“, “сжимающее кодирование“, “кодирование источника“. Обратная процедура называется восстановлением данных (распаковкой, декомпрессией). [Ябл.]

Основной характеристика алгоритма сжатия является коэффициент сжатия, который определяется как отношение объёма исходных (несжатых) данных к объёму сжатых. Чем выше коэффициент сжатия, тем алгоритм эффективнее. Играют также роль и другие характеристики, например, объем используемой памяти, быстродействие и т.д. . Разработано большое число различных алгоритмов сжатия [555]. Опишем некоторые из них. Простейший N алгоритм сжатия сводится к непосредственному применению алгоритма Хаффмана. Схема действий здесь такова:

1)При первом просмотре файла подсчитываем сколько раз каждый символ входит в этот файл. В результате получаем вектор K относительных частот символов.

2)По вектору K строим оптимальный бинарный код методом Хаффмана.

3)При втором просмотре файла каждый символ заменяем его кодом. В полученный файл добавляем таблицу кодирования.

Пример 13. Построим оптимальный бинарный код для сообщения “Параллелепипед“. Длина сообщения равна 14. Считаем, что строчные и прописные буквы не различаются. В этом случае входной алфавит состоит из 7 символов: A = fп,а,р,л,е,и,дg. Вектор K относительных частот символов таков: (3; 2; 1; 3; 3; 1; 1) (буква “п“ встретилась три раза, буква “а“ два раза и т.д.). Применяя алгоритм Хаффмана, придем к такой схеме кодирования:

8

п

-

10,

а

-

001,

р

-

011,

л - 11,

<

е

-

000,

и

-

0100,

д

-

0101.

 

:

 

 

 

 

 

 

 

 

 

 

20

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]