Энциклопедия Turbo Pascal. Главы 5-8
Страница 22. Шестнадцатибуквенный алфавит


Шестнадцатибуквенный алфавит

     Хотя это не подходит для всех ситуаций, интерес представляет
метод сжатия данных,  в котором уничтожаются  ненужные  буквы  из
слова,  то  есть  слово сокращается.  Сжатие данных происходит за
счет того,  что неиспользуемые символы не запоминаются.  Экономия
пространства  за счет сокращений довольно распространена,  напри-
мер,  "Mr" используется вместо "Mister". Вместо применения общеп-
ринятых сокращений в описываемом в данном разделе методе осущест-
вляется автоматическое удаление различных букв из сообщения.  Для
реализации этого необходимы "минимальный алфавит. Минимальным на-
зывается такой алфавит,  из которого исключены редко используемые
буквы  и оставлены только те,  которые необходимы для составления
большинства слов или для избежания неоднозначности.  Следователь-
но,  любой символ, который не входит в минимальный алфавит, будет
удален из слова, в котором он появился. Предметом выбора является
минимальный  алфавит.  В  данном разделе используются 14 наиболее
часто встречающихся букв плюс символы пробела и возврата каретки.

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

     {данная программа подсчитывает число символов каждого
              типа в файле}
     program countchars;

     type
       str80 = string[80];

     var
       inf: str80;
       t: integer;
       alpha: array[0..25] of integer;
       space, period, comma: integer;

     { данная функция возвращает TRUE, если ch является
       буквой алфавита }
     function isalpha(ch: char): boolean;
     begin
       isalpha:=(upcase(ch)>='A') and (upcase(ch)<='Z');
     end; {isalpha}

     { подсчет числа встреч каждого символа в файле  }
     procedure count(inf: str80);
     var
       infile: file of char;
       ch: char;

     begin
       assign(infile, inf);
       reset(infile);

       while not eof(infile) do
       begin
         Read(infile, ch);
         ch := upcase(ch);
         if isalpha(ch) then
           alp a[ord(ch)-ord('A')] := alpha[ord(ch)-ord('A')]+1
         else case ch of
           ' ': space := space+1;
           '.': period := period+1;
           ',': comma := comma+1;
         end;
       end;
       close(infile);
     end; {count}

     begin
       Write('введите имя входного файла: ');
       ReadLn(inf);
       for t := 0 to 25 do alpha[t] := 0;
       space := 0; comma := 0; period := 0;
       count(inf);
       for t := 0 to 25 do
         WriteLn(chr(t+ord('A')), ': ', alpha[t]);
       WriteLn('space:', space);
       WriteLn('period:', period);
       WriteLn('comma:', comma);
     end.

     После прогона данной программы с текстом данной главы вы по-
лучите следующую таблицу частот:

     A      2525        P          697
     B       532        Q           62
     C       838        R         1656
     D      1145        S         1672
     E      3326        T         3082
     F       828        U          869
     G       529        V          376
     H      1086        W          370
     I      2242        X          178
     J        39        Y          356
     K        94        Z           20
     L      1103
     M      1140        Space 1   5710
     N      2164        Period 2   234
     O      1767        Comma 3    513

     1 - пробел; 2 - точка; 3 - запятая.

     Данные частоты  использования  букв  хорошо  согласуются  со
стандартной смесью английского языка, а некоторое отклонение объ-
ясняется повторяющимся использованием ключевых слов Турбо Паскаля
в программах.
     Для того,  чтобы добиться значительного  сжатия  данных,  вы
должны существенно урезать алфавит за счет наименее часто исполь-
зуемых букв. Хотя существует много вариантов минимального алфави-
та, в данной главе в него включены 14 наиболее часто используемых
букв и пробел, которые составляют 85% всех символов данной главы.
Так как символ возврата каретки необходим для предотвращения раз-
рывов слов,  он также должен быть включен в алфавит.  Таким обра-
зом, минимальный алфавит будет следующим:

     A B D E H I L M N O R S T U <пробел><возврат каретки>

     Следующая программа  удаляет  все символы,  кроме выбранных.
Программа записывает комбинацию возврат  каретки/перевод  строки,
если она присутствует. Это делает вывод читабельным.

     { программа сжатия и удаления символов }
     program compres2;
     type
       str80 = string[80];

     var
       inf, outf: str80;
       ch: char;
       t: integer;

     procedure comp2(inf, outf: str80);
     var
       infile, outfile: file of char;
       ch: char;
       done: boolean;
     begin
       assign(infile, inf);
       reset(infile);
       assign(outfile, outf);
       rewrite(outfile);

       done := FALSE;
       repeat
         if not eof(infile) then
         begin
           Read(infile, ch);
           ch := upcase(ch);
       if pos(ch,'ABCDEJILMNORSTU')<>0 then Write(outfile,ch);
           if ord(ch)=13 then Write(outfile, ch); {cr}
           if ord(ch)=10 then Write(outfile, ch); {lf}
         end
         else done := TRUE;
       until done;
       WriteLn('файл сжат ');
       close(infile); close(outfile);

     end; {compress}

     begin
       Write('введите имя входного файла:');
       ReadLn(inf);
       Write('введите имя выходного файла: ');
       ReadLn(outf);
       comp2(inf, outf);
     end.

     8Программа использует  встроенную функцию Pos для определения
того, входит ли считанный символ в минимальный алфавит. Роs возв-
ращает  0,  если  не входит,  и номер позиции символа в алфавите,
если входит.

     Если вы примените программу к следующему сообщению

     Attention High Command:

               Attack successul. Please send additional supplies
               and fresh troops. This is essential to maintain
               our foolhold.
               General Frashier

сжатое сообщение будет следующим

     ATTENTOIN I COMMAND
             ATTAC SUCCESSUL LEASE SEND
             ADDITIONAL SULEIS AND RES TROOS TIS


Энциклопедия по Турбо-Паскалю ч.2                          = 35 =

             IS ESSENTIAL TO MAINTAIN OUR OOTOLD
             ENERAL RASIER

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

     Исходное сообщение имеет длину 168 байт, а упакованное сооб-
щение - 142 байта,  следовательно,  экономия составляет приблизи-
тельно 16%.

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

     Как метод  битового  сжатия,  так  и метод удаления символов
используются в криптографии.  Битовое сжатие само по себе шифрует
информацию  и делает декодирование более трудным.  Метод удаления
символов при применении его до шифрования имеет одно  преимущест-
во: он изменяет частоту использования символов в исходном тексте.

 
« Предыдущая статья   Следующая статья »