Основные методы компрессии
Наиболее часто повторяющиеся блоки являются и наиболее "избыточными" (redundant) и могут быть представлены в более сжатом виде. На сегодняшний день существует множество различных алгоритмов сжатия данных, подразделяющихся на несколько основных групп:
* алгоритмы кодирования повторов; * вероятностные методы; * арифметические методы; * "метод словарей" (dictionary).
Не вдаваясь глубоко в математические подробности, рассмотрим основные принципы и особенности каждого вида алгоритмов.
Кодирование повторов (Run-Length Encoding)
Этот метод, являющийся одним из старейших и наиболее простых, сегодня используется в основном для сжатия графических файлов: одним из самых распространенных форматов, организованных при помощи этого типа компрессии, является формат PCX.
"Классический" вариант этого метода предусматривает замену последовательности повторяющихся символов на строку, содержащую сам этот символ, и число, показывающее, сколько раз этот символ повторяется. Например, строка 'AAAAAACCCCCEEEFFFFFF' будет записана в виде: '6A5C3E6F'. В то же время применение этого метода для сжатия текстовых или исполняемых (EXE, COM) файлов оказывается неэффективным.
Вероятностные методы сжатия
К вероятностным методам относятся алгоритмы Шеннона-Фэно (Shannon-Fano) и Хаффмана (Huffman). В основе этих алгоритмов лежит идея построения "дерева", положение символа на "ветвях" которого определяется частотой его появления в файле. Каждому символу присваивается код, длина которого обратно пропорциональна частоте появления символа в файле. Рассмотрим пример использования метода Шэннона-Фэно:
Пусть имеется слово METHOD. Допустим, что частота появления символов определяется в виде (табл. 1). Здесь мы используем произвольные значения вероятности появления символов исходя из того, что наиболее часто встречающиеся буквы английского языка - E, O, H. В каждом реальном массиве данных частота появления символов может отличаться от приведенной нами, однако это не влияет на принцип работы метода.
|
Симвoл |
Частота |
Код |
|
M |
2 |
011 |
|
E |
8 |
00 |
|
T |
3 |
010 |
|
H |
4 |
110 |
|
O |
6 |
10 |
|
D |
1 |
111 |
Таблица. 1. Коды символов в строке "METHOD" (алгоритм Шеннона-Фэно).
Разделим строку "METHOD" на две части так, чтобы суммы частот появления символов в них были приблизительно равны:
2(M)+8(E)+3(T)*4(H)+6(O)+1(D). Теперь начнем строить "дерево" по схеме: на каждой "ветви" порции символов с большей частотой будет присваиваться двоичный ноль, а с меньшей - двоичная единица (рис. 2). В результате, каждый из символов получает свой код, по которому к нему можно добраться с вершины "дерева", при этом чем чаще встречается символ в файле, тем ближе он к вершине дерева и, значит, тем короче его адресный код.
Метод Хаффмана очень похож на метод Шеннона-Фэно, но строительство "дерева" в нем начинается не с "вершины", а с "корней" (рис. 3). Сумма частот появлений двух самых редко встречающихся символов (D и М) равна 3, символов Н и Т - 7. Далее, присваивая ветвям дерева двоичные нули и единицы, так же, как и в предыдущем методе, поднимаемся к "вершине", получая код для каждого символа.
Существуют две разновидности статистических методов, различающихся способом определения вероятности появления каждого символа в файле: - статические (static), использующие фиксированную таблицу частоты появления символов в файле, рассчитываемую перед началом процесса сжатия; - адаптивные (adaptive), в которых частота появления символов все время меняется - по мере считывания нового блока данных из файла происходит перерасчет начальных значений частот.
Статистические методы, характеризующиеся хорошим быстродействием и не требующие значительных ресурсов оперативной памяти, нашли широкое применение в многочисленных программах-архиваторах, например, ARC, PkZip и др.
