- •1. Концепция
- •Часть 1 — основное содержание базового курса,
- •Часть 2 — дополнительный материал для углубленного изучения.
- •2. Содержание
- •Глава 11. Искусственный интеллект и базы знаний (перенесено из 1-й части)
- •§ 13. Пользовательский интерфейс
- •6.2. Объектно-информационные модели
- •Пылесос
- •Телевизор
- •Телефон
- •1.3. Алфавитный подход и вероятность
- •3.1. Сжатие текстовой информации
3.1. Сжатие текстовой информации
Сжатием информации в памяти компьютера называют такое ее преобразование, которое ведет к сокращению объема занимаемой памяти при сохранении закодированного содержания. Существуют разные способы сжатия для разных типов данных. Только для сжатия графической информации используется около десятка различных методов. Здесь мы рассмотрим один из способов сжатия текстовой информации.
В восьмиразрядной таблице символьной кодировки (например, ASCII) каждый символ кодируется восемью битами и, следовательно, занимает в памяти 1 байт. В разделе 1.3 нашего учебника рассказывалось о том, что частота встречаемости разных букв (знаков) в тексте разная. Там же было показано, что информационный вес символов тем больше, чем меньше его частота встречаемости. С этим обстоятельством и связана идея сжатия текста в компьютерной памяти: отказаться от кодирования всех символов кодами одинаковой длины. Символы с меньшим информационным весом, т.е. часто встречающиеся, кодировать более коротким кодом по сравнению с реже встречающимися символами. При таком подходе можно существенно сократить объем общего кода текста и, соответственно, места, занимаемого им в памяти компьютера.
Такой подход известен давно. Он используется в широко известной азбуке Морзе, несколько кодов которой приведены в табл. 3.1, где "точка" кодируется нулем, а "тире" — единицей.
Таблица 3.1
-
Буква
А
Б
В
Г
Д
Е
Ж
Код
01
1000
011
110
100
0
0001
Как видно из этого примера и табл. 3.1, чаще встречающиеся буквы имеют более короткий код.
В отличие от кодов равной длины, которые используются в стандарте ASCII, в этом случае возникает проблема разделения между кодами отдельных букв. В азбуке Морзе эта проблема решается с помощью "паузы" (пробела), которая, по сути, является третьим символом алфавита Морзе, т.е. алфавит Морзе не двух-, а трех-символьный.
А как быть с компьютерной кодировкой, где используется двоичный алфавит? Одним из простейших, но весьма эффективных способов построения кодов разной длины, не требующих специального разделителя, является алгоритм Д.Хаффмена (D.A. Huffman, 1952 г.). С помощью этого алгоритма строится двоичное дерево, которое позволяет однозначно декодировать двоичный код, состоящий из символьных кодов различной длины. Двоичным называется дерево, из каждой вершины которого выходят две ветви. На рис. 3.2 приведен пример такого дерева, построенного для алфавита английского языка с учетом частоты встречаемости его букв. Полученные, таким образом, коды можно свести в таблицу.
Таблица 3.2
Буква |
Код Хаффмена |
Е |
100 |
Т |
001 |
А |
1111 |
О |
1110 |
N |
1100 |
R |
1011 |
I |
1010 |
S |
оно |
Н |
0101 |
D |
11011 |
L |
они |
F |
01001 |
С |
01000 |
М |
00011 |
U |
00010 |
G |
00001 |
Y |
00000 |
Р |
110101 |
W |
011101 |
В |
011100 |
V |
1101001 |
К |
110100011 |
X |
110100001 |
J |
110100000 |
Q |
1101000101 |
Z |
1101000100 |
С помощью табл. 3.2 легко кодировать текст. Так, например, строка из 29 знаков
WENEEDMOR ESNOWFORBE TTERSKIING преобразуется в код: 011101 100 1100 100 100 110110001111101011100 ОНО 1100 1110 011101 01001 1110 1011 011100 100 001001 100 10110110 110100011 1010 1010 1100 00001, который при размещении его в памяти побайтно примет вид:
01110110 01100100 10011011 00011111 01011100 01101100 11100111 01010011 11010110 1110010000100110 01011011 01101000 11101010 10110000 001
Таким образом, текст, занимающий в кодировке ASCII 29 байт, в кодировке Хаффмена займет только 16 байт.
Обратная же задача — переход от кодов Хаффмена к буквам английского алфавита — осуществляется с помощью двоичною дерева (см. рисунок). При этом перекодировка происходит путем сканирования текста слева направо с первого разряда, продвигаясь по соответствующим (имеющим тот же двоичный код) ветвям дерева до тех пор, пока не попадем в концевую вершину с буквой. После выделения в коде буквы процесс раскодирования следующей буквы начинаем снова с вершины двоичного дерева.
Нетрудно догадаться, что изображенное дерево представляет собой сокращенный вариант кода Хаффмена. В полном объеме в нем должны быть учтены все возможные символы, встречающиеся в тексте: пробелы, знаки препинания, скобки и др.
В программах, сжимающих текст — архиваторах, таблицу частоты встречаемости символов строят для каждого обрабатываемого текста, а затем формируют коды разной длины типа кодов Хаффмена. В таком случае сжатие текста становится еще более эффективным, так как кодирование настраивается именно на данный текст. И чем размер текста больше, тем эффект сжатия значительнее.
Коротко о главном
Сжатием информации называют такое ее преобразование, которое ведет к сокращению объема занимаемой памяти при сохранении закодированного содержания.
Идея способа сжатия текста: длина кода символа уменьшается с уменьшением его информационного веса, т.е. с увеличением частоты встречаемости в тексте.
Алгоритм сжатия по Хаффмену представляется в виде двоичного дерева.
Архиваторы, использующие алгоритм Хаффмена, строят свое двоичное дерево кодирования для каждого текста.
Вопросы и задания
В чем различие кодов постоянной и переменной длины?
За счет чего коды переменной длины позволяют "сжимать" текст?
Закодируйте с помощью ASCII-кодов и кодов Хаффмена следующий текст: HAPPYNEWYEAR. Подсчитайте в обоих случаях требуемый объем памяти.
4. Раскодируйте с помощью двоичного дерева (см.рисунок) следующий код:
11110111 10111100 00011100 00101100 10010011 01110100 11001111 11101101 001100
Двоичное дерево алфавита английского языка, используемое для кодирования методом Хаффмена