Я пишу программу для задания, которое должно реализовать сжатие/распаковку LZW. Я использую для этого следующие алгоритмы:
-сжатие
w = NIL;
while ( read a character k )
{
if wk exists in the dictionary
w = wk;
else
add wk to the dictionary;
output the code for w;
w = k;
}
-декомпрессия
read a character k;
output k;
w = k;
while ( read a character k )
/* k could be a character or a code. */
{
entry = dictionary entry for k;
output entry;
add w + entry[0] to dictionary;
w = entry;
}
Для этапа сжатия я просто вывожу целые числа, представляющие индекс для словарной записи, также начальный словарь состоит из символов ascii (0–255). Но когда я перехожу к этапу распаковки, я получаю эту ошибку, например, если я сжимаю текстовый файл, состоящий только из «booop», он выполнит следующие шаги для создания выходного файла:
w k Dictionary Output
- b - -
b o bo (256) 98 (b)
o o oo (257) 111 (o)
o o - -
oo p oop (258) 257 (oo)
p - - 112 (p)
вывод.txt: 98 111 257 112
Затем, когда я приду, чтобы распаковать файл
w k entry output Dictionary
98 (b) b
b 111 (o) o o bo (256)
o 257 (error)
257 (оо) еще не добавлено. Может ли кто-нибудь увидеть, где я ошибаюсь, потому что я в тупике. Алгоритм неверен?