Словарь LZW, примеры работы, особенности

Читатель, который тщательно следил за нашими построениями до этого момента будет счастлив узнать, что декодер LZW использует словарь очень простым способом, не применяя хеширование. Сначала декодер, как и кодер заполняет первые 256 позиций словаря кодами ASCII. Затем он читает указатели из входного файла и использует их для нахождения символов в словаре. На первом шаге декодирования, декодер вводит первый указатель и использует его для обнаружения в словаре первой строки I.

Этот символ записывается в выходной (разжатый) файл. Теперь необходимо записать в словарь строку 1х, но символ х еще не известен; им будет первый символ следующей строки извлекаемой из словаря. На каждом шаге декодирования после первого декодер читает следующий указатель из файла, использует его для извлечения следующей строки J из словаря и записывает эту строку в выходной файл. Если указатель был равен, скажем, 8, то декодер изучает поле diet.

Если это поле равно 8, то это правильный узел. В противном случае декодер изучает последующие элементы массива до тех пор, пока не найдет правильный узел. После того, как правильный узел найден, его поле parent используется при проходе назад по дереву для извлечения всех символов строки в обратном порядке. Затем символы помещаются в J в правильном порядке, декодер извлекает последний символ х из J и записывает в словарь строку в следующую свободную позицию. (Строка I была найдена на предыдущем шаге, поэтому на дерево необходимо добавить только один узел с символом х.) После чего декодер перемещает J в I. Теперь он готов для следующего шага. Для извлечения полной строки из дерева LZW декодер следует по указателям полей parent.

Это эквивалентно продвижению вверх по дереву. Вот почему хеширование здесь не нужно. У декодера не возникает необходимости делать хеширование и применять поле index. Нам осталось обсудить обращение строки. Возможны два варианта решения. Использовать стек. Это часто применяемая структура в современных компьютерах. Стеком называется массив в памяти, к которому открыт доступ только с одного конца.

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

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

Опубликование в 1984 году алгоритма LZW произвело большое впечатление на всех специалистов по сжатию информации. За этим последовало большое количество программ и приложений с различными вариантами этого метода.

-----------------------------