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]
Справочник алгоритмов v0.05 © 2007-2025 Igor Salnikov aka SunDoctor