- •Лабораторная работа №2
- •"Защита программ и данных от hcд".
- •Например, рисунок буквы т может быть закодирован следующим образом:
- •Понятно, что число кодируемых направлений можно увеличить. В этом случае данный подход может быть приемлем и для более сложных изображений.
- •8) Фрактальное сжатие изображений.
- •9) Разбиение исходyого множества символов на несколько алфавитов.
- •10) Смысловая архивация.
- •11) Поиск закономерностей.
- •12) Выбор алгоритма архивации.
Лабораторная работа №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 байта .
В приведенном примере мы исходили из линейного расположения символов. Однако, когда речь идет о сжатии файлов, содержащих информацию об изображениях , бывает удобно представлять сжимаемые коды в двумерном или трехмерном пространстве.
