Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Arkhivatsia.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
190.98 Кб
Скачать

Лабораторная работа №2

Эффективное кодирование .(Архивация.)

Основные критерии при выборе алгоритма архивации это:

- время архивации;

- время дезархивации;

- коэффициент сжатия. Под коэффициентом сжатия будем понимать отношение объемов (в битах) исходного текста к архивированному.

Главный принцип, лежащий в основе всех алгоритмов архивации – устранить из сжимаемого текста избыточность. Под избыточностью обычно понимаются части текста, не несущие никакой информации для воспринимающего объекта. Строго понятие избыточности можно определить следующим образом [52]:

Если какой-либо текст состоит из знаков, каждый из которых может принимать

q значений, и каждый знак содержит Н битов информации то избыточностью текста называется величина

R = 1 - H/1og2 (q)

Придерживаясь данного определения избыточности рассмотрим обычный текст :

"Защита программ и данных от hcд".

При размещении в оперативной памяти ЭВМ данный текст занимает 31 байт (символ - байт). Это, конечно, только в том случае, если для его кодировки используется стандартная кодировочная таблица ASC II (Приложение 1.1). Однако, в случае вышеприведенного текста при стандартной кодировке многие биты байта не несут никакой информации и, попросту говоря, не используются.

Действительно, рассмотрим несколько альтернативных способов его кодировки.

1) Табличный вариант.

Пусть в исходном тексте16 различных символов. Значит для кодировки каждого символа достаточно 4 бита.

Например: Символ Код

З 0000

А 0001

Щ 0010

И 0011

Т 0100

П 0101

Р 0110

О 0111

Г 1000

М 1001

А 1010

Н 1011

Ы 1100

Х 1101

С 1110

пробел 1111

В случае применения данной таблицы закодированный текст займет всего 31/2 + 1 = 16 байт. Экономия памяти налицо и, к тому же, исходный текст спрятан от визуального просмотра.

Объем закодированного текста может быть определен по формуле V = b * n

где b = LOG2(k)

k - всего разных символов в тексте;

n - всего символов в тексте.

В данном случае коэффициент сжатия (KС) будет рассчитываться по формуле:

КС = 8*n / n*1og2( k)

2) Символы текста имеют разную частоту повторения в тексте, а это значит, что наиболее популярные из них можно кодировать меньшим числом бит, а менее популярные большим, т.е. речь идет о коде переменной длинны позволяющим однозначно восстанавливать исходный текст. Подобный код, в котором ни одно кодовое слово не совпадает с начальным отрезком какого-нибудь другого кодового слова, называется префиксным кодом (кодом Хаффмэна). В случае применения префиксных кодов для кодирования текста можно не указывать конец символа и записывать один код за другим без разграничителя. Например:

Символ

Частота повторения

Kод

Обьем (бит)

пробел

5

1

5

А

4

01

8

Н

3

001

9

М

2

0001

8

Л

2

00001

10

И

2

000001

12

Т

2

0000001

14

Р

2

00000001

16

П

1

000000001

9

О

1

0000000001

10

Г

1

00000000001

11

Ш

1

000000000001

12

З

1

0000000000001

13

Ы

1

00000000000001

14

Х

1

000000000000001

15

С

1

0000000000000001

16

182 бита

В случае применения этой таблицы закодированный текст займет int (182/8) + 1 = 23 байта.

Однако возможен выбор другой кодировочной таблицы, например:

Символ

Частота повторения

Kод

Обьем (бит)

пробел

5

00

10

А

4

01

8

Н

3

101

9

М

2

110

6

Л

2

1001

8

И

2

1000

8

Т

2

1110

8

Р

2

11110

10

П

1

111110

6

О

1

1111110

7

Г

1

11111110

8

Ш

1

111111110

9

З

1

1111111110

10

Ы

1

11111111110

11

Х

1

111111111110

12

С

1

111111111111

12

132 бита

В случае применения этой таблицы закодированный текст займет int(132/8) + 1 = 17 байт.

Объем закодированного текста может быть определен по формуле

i = k

V = SUM ( bi * pi )

i = 1

где

k - всего разных символов в тексте;

рi - число повторений i-го символа;

ni – длина кода i-го символа.

Возможен и третий вариант кодировочной таблицы, например:

Символ

Частота повторения

Kод

Обьем (бит)

пробел

5

000

15

А

4

001

12

Н

3

010

9

М

2

110

6

Л

2

011

6

И

2

101

6

Т

2

1000

8

Р

2

1110

8

П

1

10010

5

О

1

10011

5

Г

1

111100

6

Ш

1

111101

6

З

1

111110

6

Ы

1

1111110

7

Х

1

11111110

8

С

1

11111111

8

121 бита

Из приведенных выше трех кодовых таблиц наиболее оптимальной оказалась последняя – всего 124 бита. Таким образом, перед нами возникла еще одна задача: каким образом подходить к выбору префиксного кода?

Ясно, что выбор оптимального для кодирования префиксного кода во многом определяется частой кодируемых символов в тексте и общим числом различных символов (размер алфавита). Например, если в тексте нашего примера после каждого символа будет стоять двойной пробел, то, в этом случае, наиболее экономичным станет префиксный код.

Префиксные коды строятся на базе частотных характеристик символов текста и как следствие, подчиняются определенным законам [63]. Например.

Пусть:

Nк - число k-битных кодов в примитивном префиксном коде;

r - длина в битах самого длинного кода,

1 2 r

Тогда N1 / 2 + N2 / 2 + …………..+ Nr / 2 = 1

Nk = 2 k - 2 ;

qi - частота i символа в тексте;

i

pi = Ni / 2

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

3) Каждый символ текста может быть охарактеризован позицией (местом) в тексте от начала текста или, относительно такого же символа. "ЗАЩИТА ПРОГРАММ И ДАННЫХ ОТ НСД".

Символ

Место

Максим. Расстояние

З

0

0

А

1,5,12,19

7

Щ

2

0

И

3,16

13

Т

4,26

22

П

7

0

Р

8, 11

3

О

9,25

6

Г

10

0

М

13,14

1

А

18,3

12

Н

20,21,28

7

Ы

22

0

Х

23

0

С

29

0

пробел

6,15,17,24,27

9

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

<код символа>(<место в тексте>)<признак конца>

i = k

V = SUM (bi + (ri + 1 )* log 2 (n) )

i = 1

n - число символов в тексте;

b - размер кода символа в битах;

r - число повторений символа в тексте;

k - всего разных символов в тексте;

8*31 + 31 *4 = 31 *12 = 372 <= 47 байт

Данный подход может быть полезен для архивации данных только в том случае, когда <код символа> занимает значительно больше бит в сравнении с <местом в тексте> или когда кодируются не символы, а слова или словосочетания. При наличии словаря (таблица 3) исходный текст может быть закодирован 17 байт.

V = 6 * ( 16 + 2 * 3) = 132 бит <= 17 байт.

Для взятого примера:

n = 6 слов (размер текста в кодируемых элементах);

b = 16 бит (размер в битах одного кода);

r = 1 слово (число повторений различных кодов);

k = 6 слов (всего различных кодов).

Таблица 3.

Слово

Порядковый

номер ( b = 2 байта )

ДАННЫХ

…….

ЗАЩИТА

44

И

45

……..

46

НСД

……

…….

77

ОТ

…….

ПРОГРАММ

90

……..

91

4) Многократное повторение символов в тексте.

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

(<код символа><число повторений>)

Данный алгоритм эффективен, когда размер используемого алфавита порядка нескольких символов (Z, 3 символа) и при этом каждый символ достаточно часто повторяется. Этот подход удобен для сжатия текстов, содержащих информацию о графических изображениях.

Объем:

V = ( g + b ) * m ,

где

g = log 2 (k) ;

b = log 2 (n) ;

m - число цепочек повторяющихся символов;

k - число различных символов;

n - всего символов в тексте;

Для вышеприведенного текста из символов «а» и «б» объем архивированного результата составит:

V = ( log 2 (2) + log 2 (31) ) * 3 = 6 * 3 = 18 бит < = 3 байта .

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

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