Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Itog.docx
Скачиваний:
12
Добавлен:
03.09.2019
Размер:
745.71 Кб
Скачать
  1. Словарные методы кодирования. Метод Зива—Лемпела.

Сущность: фразы в сжимаемом тексте заменяются указателем на то место,

где они в этом тексте уже ранее появлялись.

Обозначается как LZ-сжатие. Этот метод быстро приспосабливается к структуре текста и может кодировать короткие функциональные слова, так как они очень часто в нем появляются. Новые слова и фразы могут также формироваться из частей ранее встреченных слов.

Наиболее распространенные реализации алгоритма LZ:

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

добиться сжатия, он пытается заменить очередной фрагмент сообщения на

указатель в содержимое словаря. LZ77 использует "скользящее" по сообщению окно, разделенное на две неравные части. Первая, большая по размеру, включает уже просмотренную часть сообщения. Вторая, намного меньшая, является буфером, содержащим еще незакодированные символы входного потока, обычно размер окна составляет несколько килобайт, а размер буфера — не более ста байт. Алгоритм пытается найти в словаре (большей части окна) фрагмент, совпадающий с содержимым буфера.

Алгоритм LZ77 выдает коды, состоящие из трех элементов: 1) смещение в словаре относительно его начала подстроки, совпадающей с началом содержимого буфера;

2) длина этой подстроки; 3) первый символ буфера, следующий за подстрокой.

Недостатки LZ77:

1) с ростом размеров словаря скорость работы алгоритма-кодера пропорционально замедляется; 2)кодирование одиночных символов очень неэффективно.

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

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

Описание основного алгоритма LZW

Данный алгоритм LZW при сжатии (кодировании) динамически создаёт таблицу преобразования строк: определённым последовательностям символов (словам) ставятся в соответствие группы бит фиксированной длины (обычно 12-битные). Таблица инициализируется всеми 1-символьными строками (в случае 8-битных символов — это 256 записей). По мере кодирования, алгоритм просматривает текст символ за символом, и сохраняет каждую новую, уникальную 2-символьную строку в таблицу в виде пары код/символ, где код ссылается на соответствующий первый символ. После того как новая 2-символьная строка сохранена в таблице, на выход передаётся код первого символа. Когда на входе читается очередной символ, для него по таблице находится уже встречавшаяся строка максимальной длины, после чего в таблице сохраняется код этой строки со следующим символом на входе; на выход выдаётся код этой строки, а следующий символ используется в качестве начала следующей строки.

Пошаговое описание алгоритма-кодера.

Шаг 1. Инициализация словаря всеми возможными одно символьными фразами

(обычно 256 символами). Инициализация входной фразы w первым символом

сообщения.

Шаг 2. Считать очередной символ К из кодируемого сообщения.

Шаг 3. Если КОНЕЦ_СООБЩЕНИЯ

Выдать код для w

Конец

Если фраза wK уже есть в словаре

Присвоить входной фразе значение wK

Перейти к Шагу 2

Иначе

Выдать код w

Добавить wK в словарь

Присвоить входной фразе значение К

Перейти к Шагу 2.

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

Алгоритмы LZ-стиля (включая LZW, LZ77, LZ78 и др.) очень популярны везде, где требуется универсальное сжатие. LZW используется в стандарте модема V.42bis, протоколе передачи данных ZModem, форматах GIF, TIFF, ARC и других прикладных программах. Другие алгоритмы LZ используются в дисковых утилитах сжатия типа DoubleSpace и Stacker, графических форматах типа PNG, а также в универсальных утилитах архивирования и сжатия, включая ZIP, GZIP и LHA. В настоящее время, реализация алгоритма содержится в программе Adobe Acrobat.

Декодирование

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

Кодирование длин повторений, алгоритм RLE.

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

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

Например:

44 44 44 11 11 11 11 11 01 33 FF 22 22 - исходная последовательность

03 44 04 11 00 03 01 03 FF 02 22 - сжатая последовательность

Первый байт указывает сколько раз нужно повторить следующий байт

Если первый байт равен 00, то затем идет счетчик, показывающий сколько за ним следует неповторяющихся данных. Данные методы, как правило, достаточно эффективны для сжатия растровых графических изображений (BMP, PCX, TIF, GIF), т.к. последние содержат достаточно много длинных серий повторяющихся последовательностей байтов. Недостатком метода RLE является достаточно низкая степень сжатия. Конечно, кодирование, которое используется для хранения изображений, оперирует с двоичными данными, а не с символами ASCII (как в примере), однако принцип остаётся тот же.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]