Алгоритм сжатия LZW


LZW - один из самых изящных алгоритмов, не использующий глубокую
математическую модель и работающий в один проход. Алгоритм уступает
по степени сжатия алгоритму Хаффмана и другим математическим
алгоритмам, но значительно превосходит RLE и аналоги. И сама идея
алгоритма очень занимательна. Это мой самый первый серьезный
алгоритм, который я реализовал и на QBASIC 4.x и на PASCAL 5.x и на
C++, и под Windows, и под Linux. Сейчас реализацию не привожу - пока
только алгоритм.


== Алгоритм сжатия данных LZW ==

[1]   Инициализация таблицы строк;
[2]   [.с.] <- пусто;
[3]   К <- следующий символ в потоке символов;
[4]   Есть ли  [.с.]К  в таблице строк ?
[5]        (Да:   [.с.] <- [.с.]К
[6]               Идти на [3] )
[7]        (Нет:  Добавить [.с.]К  в таблицу строк
[8]               Вывести код для [.с.] в поток кодов
[9]               [.с.] <- К
[10]              Идти на [3] )

== Алгоритм декомпрессии данных LZW ==

[1]    Инициализировать таблицу строк
[2]    Взять первый код <код>
[3]    Вывести строку для <кода> в поток символов
[4]    <старый код> := <код>
[5]    <код> := следующий код в потоке кодов
[6]    Этот код существует в таблице строк ?
[7]         (Да:   Вывести строку для кода в поток символов
[8]                [...] := трансляцию для старого кода
[9]                К := первый символ трансляции для <кода>
[10]               Добавить [...]К в таблицу строк
[11]               <старый код> := <код>  )
[12]        (Нет:  [...] трансляцию для <старого кода>
[13]               К := первый символ из [...]
[14]               Вывести [...]К в поток символов и добавить его к таблице
[15]               <старый код> := <код>  )
[16]   Идти на [3]