Классический алгоритм Лемпеля-Зива – LZ77, названный так по году своего опубликования, предельно прост. Он формулируется следующим образом : «если в прошедшем ранее выходном потоке уже встречалась подобная последовательность байт, причем запись о ее длине и смещении от текущей позиции короче чем сама эта последовательность, то в выходной файл записывается ссылка (смещение, длина), а не сама последовательность». Так фраза «КОЛОКОЛ_ОКОЛО_КОЛОКОЛЬНИ» закодируется как «КОЛО(-4,3)_(-5,4)О_(-14,7)ЬНИ».
Распространенный метод сжатия RLE (англ. Run Length Encoding), который заключается в записи вместо последовательности одинаковых символов одного символа и их количества, является подклассом данного алгоритма. Рассмотрим, например, последовательность «ААААААА». С помощью алгоритма RLE она будет закодирована как «(А,7)», в то же время ее можно достаточно хорошо сжать и с помощью алгоритма LZ77 : «А(-1,6)». Действительно, степень сжатия именно такой последовательности им хуже (примерно на 30-40%), но сам по себе алгоритм LZ77 более универсален, и может намного лучше обрабатывать последовательности вообще несжимаемые методом RLE.
Алгоритм Лемпеля-Зива
06 Мар, 2009
