Если информация анкетного типа, записанная в алфавитно-цифровой форме, то можно использовать вместо части повторяющегося текста два значка (символа). Один из символ повтора, а второй – сколько букв пропущено при повторе.
2.4 Зонное сжатие
Метод зонного сжатия используют для текстовых массивов с учетом символов естественного алфавита и знаков препинания.
28 = 256
предложено использовать четыре бита (полубайт) для записи каждой буквы, тем самым создавая некоторый алфавит из шестнадцати букв, где каждая ячейка дает нам m = 24 = 16
162 = 256
Мы наши шестнадцать букв делим на некоторое количество зон:
0 | 0000 | 4 | 0100 | 8 | 1000 |
1 | 0001 | 5 | 0101 | 9 | 1001 |
2 | 0010 | 6 | 0110 | A | 1100 |
3 | 0011 | 7 | 0111 | B | 1011 |
C | 1100 | D | 1101 | E | 1110 |
F | 1110 |
Для русского алфавита достаточно 13 букв, распределенных по трем зонам.
0…С – имена букв
D…F – имена зон
С учетом вероятности появления букв друг с другом в тексте, таблица для русского алфавита выглядит следующим образом:
D | E | F | |
0 | Space | З | Ц |
1 | О | У | Ж |
2 | Е | Д | Х |
3 | А | Я | Ч |
4 | Р | Ь | Э |
5 | П | Ф | Ю |
6 | Т | Ы | , |
7 | Н | Щ | . |
8 | В | Ш | ; |
9 | И | Б | : |
A | С | Г | ! |
B | М | К | ? |
C | Л | Й | - |
Сжатие определяется нахождением букв в одной или в соседних зонах. И вероятность нахождения буквы где-либо по отношению к другой букве:
а – вероятность нахождения буквы в зоне D
в – вероятность нахождения буквы в зоне F
Каждая буква записывается двумя символами:
номер зоны
номер буквы
если рядом стоящие буквы попадают в одну зону, то номер зоны пишется только один раз, а буквы чередуем.
В некоторых случаях можно использовать сочетание из двух и более букв в таблице, разделенные по зонам, принцип разделения можно оставить тем же.
Любой из перечисленных методов сжатия используется тогда, когда он дает максимальный эффект, который определяется величиной коэффициента сжатия или объемом сэкономленной памяти.
3. Выбор и обоснование решения задачи
4. Теоретическое обоснование метода Лавинского
Данный метод предполагает сжатие последовательности чисел путём разбиения последовательности на равномерные интервалы и отыскание числа не в его натуральном виде путем перебора всех подряд, а с помощью порядкового номера отсчета от ближайшей границы.
Сам метод состоит в следующем. Пусть имеем некоторое количество чисел М и максимальное по длине число L. Очевидно, что для хранения в натуральном виде этих чисел необходимо следующее количество ячеек
Q = M * log 2 L (1)
Лавинский предложил множество М разбить на N интервалов. Интервалы между собой равные и тогда очевидно, что для хранения самих чисел необходим следующий объем памяти
Q’ = M * log 2 (L / N) (2)
И нам необходимо хранить информацию об этих самых границах
Q” = (M – 1) * log 2 (N - 1) (3)
В целом объем памяти необходимый для самих чисел и памяти будет следующим
Q = Q’ + Q” (4)
Взяв производную из (4), для нахождения оптимального разбиения последовательности и приравняв ее нулю, получим
N ОПТ = М / ln M (5)
Формула (5) определяет оптимальное количество интервалов. Для определения величины самого интервала мы все количество возможных вариантов относим к количеству самого интервала, то есть для определения количества символов в интервале используем следующую формулу
C = 2 [log2 N] / N (6)
Для нахождения самого интервала (номер границы) используем следующее отношение
К = Х / С (7),
где Х – искомое число в натуральном виде.
После этого само число записывается, как порядковый отсчет этой границы и определяет экономию памяти как
D Q = QИСХ – QОПТ (8)
Пусть интервал 128, Х = 200, тогда К = 1.56. К лежит 2> K> 1, значит код числа составит 200 – 127 = 73.
5 Программная реализация
Для разработки программы был выбран язык программирования высокого уровня Delphi 5.0 (Object Pascal).
Он весьма полно выражает идеи структурного программирования. Это проявляется в том, что Delphi может успешно использоваться для записи программ на разных уровнях ее детализации, не прибегая к помощи блок-схем или специального языка проектирования программ. Средства языка Delphi позволяют осуществлять достаточный контроль правильности использования данных различных типов и программных объектов как на этапе трансляции, так и на этапе ее выполнения.
Delphi позволяет без особых трудностей реализовать удобный пользовательский интерфейс, не пребегая к написанию низкоуровневого кода.
В программе есть так же возможность считать данные для кодирования из файла.
Заключение
В ходе выполнения курсовой работы были закреплены знания, полученные в ходе изучения дисциплины «Кодирование и защита информации». Работа выполнена в соответствии с постановкой задачи на курсовое проектирование.
Для проверки работоспособности программы и правильности обработки входных данных разработан тестовый пример. Тестирование программы подтвердило, что программа правильно выполнила обработку данных и выдает верные результаты.
Конспект лекций по дисциплине “Кодирование и защита информации”.
Березюк Н. Т., Андрющенко А. Г., Мощинский С. С. и др. Кодирование информации – Харьков: Выща школа, 1978. – 252 с.
Кузьмин И. В., Кедрус В. А. Основы теории информации и кодирования. – Киев: Выща школа, 1977. – 280 с.
Цымбал В. П. Теория информации и кодирование. Киев, ”Вища школа”, 1997, 288 с.
Приложение А
uses
Forms,
Kizi in 'Kizi.pas' {Main};
{$R *.res}
begin
Application.Initialize;
Application.CreateForm(TMain, Main);
Application.Run;
end.
unit Kizi;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,math;
type
TMain = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
fOpen: TOpenDialog;
fSave: TSaveDialog;
procedure Button3Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Main : TMain;
f,f1:textfile;
i1:integer; // счетчик элементов (чисел) в файле
massivelementov: array [0..24]of longint;// сжимаемый массив
massivelementov1: array[0..3,0..4] of longint; //рабочий массив разбитый на интервалы
kolelementovfila:real;//количество элементов М
maxchislo:integer;// Максимальное число из М
chisloposled:integer; //Количество элементов в интервале
Interval:integer;//количество интервалов
kolmetok:integer;// количесьво меток
k:real;//флаг опред метки
polovina:real;//половина интервала
nomer:integer; // порядковый номер массива
granica:array of integer;//порядковый номер границы от нуля
mm:integer;
implementation
{$R *.dfm}
function DecToBin(dec:integer):string;
var
bin:string;
i:integer;
begin
bin:='';
for i:=1 to 8 do
begin
bin:=inttostr(dec mod 2)+bin;
dec:=dec div 2;
end;
DecToBin:=bin;
end;
function Bin24ToDec24(bin:string):integer;
var
i:integer;
dec:integer;
begin
if strlen(pchar(bin))<24 then
for i:=strlen(pchar(bin))+1 to 24 do
bin:='0'+bin;
dec:=0;
for i:=0 to 23 do
dec:=dec+trunc(strtoint(copy(bin,24-i,1))*intpower(2,i));
Bin24ToDec24:=dec;
end;
function Dec24ToBin24(dec:integer):string;
var
bin:string;
i:integer;
begin
bin:='';
for i:=1 to 24 do
begin
bin:=inttostr(dec mod 2)+bin;
dec:=dec div 2;
end;
Dec24ToBin24:=bin;
end;
procedure TMain.Button3Click(Sender: TObject);
begin
Main.close;
end;
procedure TMain.Button1Click(Sender: TObject);
var
c:char;
g,i,j:integer;
fileperem:array [0..9999] of char;
fileperem1:array [0..9999] of string;
flag1:integer;// счетчик символов в файле
flag2:integer;// счетчик элементов массива fileperem1
flag3:integer;//флаг содержания буквы в фмйле
flag4:integer;// флаг выхода из блока чтения из файла
flag5:integer;// условие увеличения флага flag2
metca:integer;//для определения значения интервла
outBuf: array[1..3] of Char;
outf: file of char;
outpos:integer;
outcomb:string;
tmp:char;
k:integer;
begin
// Чтение из файла
//---------------------------------------
fopen.Filter:='Текстовые файлы | *.txt';
fsave.Filter:='Архивированные файлы | *.arhi';
While flag4<>1 do
begin
i:=0;
flag4:=1;
if fopen.Execute then
begin
flag3:=0;
assignfile(f,fopen.filename);
reset(f);
for i:=0 to 9999 do fileperem[i]:=' ';
i:=0;
while (not eof(f)) and (i<100000) do
begin
read(f,c);
if (c<>' ')and((c<'0')or(c>'9'))and(c<>'-')and (c<>'+')and (c<>#13)and
(c<>#10 ) then
begin
if MessageDlg('Фаил содержит буквенный символ. Указать другой фаил?',
mtconfirmation,[mbYes,mbno],0) =mryes
then flag3:=1 else flag3:=11;
i:=1000000;
end else
begin
fileperem[i]:=c;
i:=i+1;
if i>99999 then
begin
showmessage('Фаил слишком большой');
flag3:=1;
i:=1000000;
end;
end;
end;
end;
if flag3=1 then
begin
flag3:=12;
flag4:=0;
end;
end;
//---------------------
// Забивка рабочего массива
//------------------------------
flag1:=0;
flag2:=0;
if (flag3=0) or (flag3=1) and (flag3<>11) then
begin
if flag3<>1 then
begin
while flag1<=i do
begin
while (fileperem[flag1]<>#13)and(fileperem[flag1]<>' ')and
(fileperem[flag1]<>#10) do
begin
fileperem1[flag2]:=fileperem1[flag2]+fileperem[flag1];
flag1:=flag1+1;
flag5:=1;
end;
flag1:=flag1+1;
if flag5=1 then
begin
flag2:=flag2+1;
flag5:=0;
end;
end;
kolelementovfila:=flag2;
{SetLength(massivelementov, trunc(kolelementovfila));
SetLength(massivelementov1, trunc(kolelementovfila));}
maxchislo:=strtoint(fileperem1[0]);
for i:=0 to trunc(kolelementovfila)-1 do
begin
massivelementov[i]:= strtoint(fileperem1[i]);
if maxchislo< massivelementov[i] then maxchislo:=massivelementov[i];
end;
end;
end;
//---------------------------------
// алгоритм кодирования
//---------------------------------
// определение колличества интервалов и числа символов в них
//---------------------------------
if (flag3=0) or (flag3=1) and (flag3<>11) then
begin