Алгоритм Хаффмана

Алгоритм KWE

Алгоритм RLE

В основу этого алгоритма положен принцип выявления повторяющихся последовательностей данных и замены их простой структурой, в которой указхывается код данных и коэффициент повтора.

Например, для последовательности: 0; 0; 0; 127; 127; 0; 255; 255; 255; 255 (всего 10 байт) образуется следующий вектор:

 

Значение Коэффициент повтора

 

При записи в строку он имеет вид: 0; 3; 127;2; 0; 1; 255;4 (всего 8 байт).

В данном примере коэффициент сжатия равен 8/10, т.е. экономия объема составляет 20 %.

Программные реализации алгоритмов RLE отличаются простотой, высокой скоростью работы, но в среднем обеспечивают недостаточное сжатие. Наилучшими объектами для данного алгоритма являются графические файлы, в которых большие одноцветные участки изображения кодируются длинными последовательностями одинаковых байтов. Этот метод также может давать заметный выигрыш на некоторых типах файлов баз данных, имеющих таблицы с фиксированной длиной полей. Для текстовых файлов данных методы RLE, как правило, не эффективны.

 

В основу алгоритмов кодирования по ключевым словам положено кодирование лексических единиц исходного документа группами байтов фиксированной длины. Примером лексической единицы может служить слово. Результат кодирования сводится в таблицу, которая прикладывается к результирующему коду и представляет собой словарь. Обычно для англоязычных текстов принято использовать двухбайтовую кодировку слов. Образующиеся при этом пары байтов называют токенами.

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

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

 

В основе этого алгоритма лежит кодирование не байтами, а битовыми группами:

ü перед началом кодирования производится частотный анализ кода документа и выявляется частота повтора каждого из встречающихся символов;

ü чем чаще встречается тот или иной символ, тем меньшим количеством битов он кодируется;

ü образующаяся в результате кодирования иерархическая структура прикладывается к сжатому документу в качестве таблицы соответствия.

 

Пример кодирования символов русского алфавита представлен на рис.1.

 
 


1 бит

 
 


2 бит

       
 
   
 


4 бит

               
       


6 бит

 

8 значений
8 бит ……………………… ……………………….

 

16 значений
10 бит ……………………… ………………………

 

…………………………………………………………………………………….

 
 
128 значений


16 бит ………………………. ……………………..

 

Рис..1. Пример побуквенного кодирования русского алфавита по алгоритму Хаффмана

 

Как видно из схемы, представленной на рис.1, используя 16 бит, можно закодировать до 256 различных символов. Однако ничто не мешает использовать и последовательности длиной до 20 бит – тогда можно закодировать до 1024 лексических единиц (это могут быть не символы, а группы символов, слоги и даже слова).

В связи с тем, что к сжатому архиву необходимо прикладывать таблицу соответствия, на файлах малых размеров алгоритм Хаффмана малоэффективен. В среднем, наиболее эффективными оказываются архивы с размером словаря от 512 до 1024 единиц (длина кода до 18-20 бит).