Введение

Кодер словаря, также иногда называемый кодером замещения, представляет собой класс алгоритмов сжатия данных без потерь, которые работают, осуществляя поиск совпадений между текстом, подлежащим сжатию, и набором строк, содержащихся в структуре данных (называемой «словарь»), поддерживаемой кодировщиком. Когда кодировщик находит такое совпадение, он заменяет его ссылкой на позицию этой строки в структуре данных.

Методы и применения

Некоторые кодировщики словарей используют "статический словарь", полный набор строк которого определяется до начала кодирования и не изменяется в процессе кодирования. Этот подход наиболее часто применяется, когда сообщение или набор сообщений, подлежащих кодированию, фиксированы и велики; например, приложение, хранящее содержимое книги в ограниченном объеме памяти КПК, обычно создает статический словарь на основе конкорданса текста, а затем использует этот словарь для сжатия отрывков. Эта схема использования кодирования Хаффмана для представления индексов в конкордансе получила название "Хаффворд". В смежном и более общем методе словарь строится на основе избыточности, извлеченной из среды данных (различных входных потоков), который затем статически используется для сжатия дополнительного входного потока. Например, словарь строится на основе старых английских текстов, а затем используется для сжатия книги. Более распространены методы, при которых словарь начинается в некотором предопределенном состоянии, но его содержимое изменяется в процессе кодирования на основе уже закодированных данных. Алгоритмы LZ77 и LZ78 работают по этому принципу. В LZ77 круговой буфер, называемый "скользящим окном", хранит последние N байтов обработанных данных. Это окно служит словарем, эффективно сохраняя каждую подстроку, которая встречалась в предыдущих N байтах, в качестве элементов словаря. Вместо одного индекса, идентифицирующего элемент словаря, требуются два значения: длина, указывающая длину совпавшего текста, и смещение (также называемое расстоянием), указывающее, что совпадение найдено в скользящем окне, начиная со смещения байтов до текущего текста. LZ78 использует более явную структуру словаря; в начале процесса кодирования словарь пуст. Значение индекса ноль используется для обозначения конца строки, поэтому первый индекс словаря равен единице. На каждом шаге процесса кодирования, если совпадение не найдено, последний совпадающий индекс (или ноль) и символ добавляются в словарь и выводятся в сжатый поток. Если совпадение найдено, рабочий индекс обновляется до совпадающего индекса, и ничего не выводится. LZW аналогичен LZ78, но словарь инициализируется всеми возможными символами. Типичная реализация работает с 8-битными символами, поэтому словарные "коды" для hex 00 до hex FF (десятичное 255) предопределены. Элементы словаря будут добавляться, начиная с кода hex 100. В отличие от LZ78, если совпадение не найдено (или достигнут конец данных), выводится только код словаря. Это создает потенциальную проблему, поскольку выход декодера на один шаг отстает от словаря. Обратитесь к описанию LZW, чтобы узнать, как это обрабатывается. Улучшения LZW включают поддержку размеров символов, отличных от 8 бит, и наличие зарезервированных кодов для сброса словаря и указания конца данных.