Алгоритм Лемпеля-Зива (LZ-compression)
Суть данного алгоритма состоит в следующем: упаковщик постоянно
хранит некоторое количество последних обработанных символов в буфере. По мере обработки входного потока вновь поступившие символы попадают в
конец буфера, сдвигая предшествующие символы и вытесняя самые старые.
Размеры этого буфера, называемого также скользящим словарем, варьируются в разных реализациях кодирующих систем. Затем, после построения хеш-таблиц, выделяют (путем поиска в словаре) самую длинную начальную подстроку входного потока, совпадающую с одной из подстрок в словаре, и выдают на выход пару (length, distance), где length - длина найденной в словаре подстроки, а distance - расстояние от нее до входной подстроки (то есть фактически индекс подстроки в буфере, вычтенный из его размера). Если такая подстрока не найдена, в выходной поток просто копируется очередной символ входного потока [7].
Существует довольно большое семейство LZ-подобных алгоритмов,
различающихся, например, методом поиска повторяющихся цепочек. Один из достаточно простых вариантов этого алгоритма, например, предполагает, что во входном потоке идет либо пара <счетчик, смещение относительно текущей позиции>, либо просто <счетчик> “пропускаемых” байт и сами значения байтов. При разархивации для пары <счетчик, смещение> копируются <счетчик> байт из выходного массива, полученного в результате разархивации, на <смещение> байт раньше, а <счетчик> (т.е. число равное счетчику) значений “пропускаемых” байт просто копируются в выходной массив из входного потока. Данный алгоритм является несимметричным по времени, поскольку требует полного перебора буфера при поиске одинаковых подстрок. К достоинствам LZ можно отнести чрезвычайную простоту алгоритма декомпрессии.
Дата добавления: 2015-04-07; просмотров: 854;