如何解决LZW算法难以理解减压
我使用LZW压缩算法压缩了以下消息:“ ababcbababaaaaaaaaa”。
在a = 1; b = 2; c = 3的情况下,我得到以下消息:“ 1 2 4 3 5 8 1 10 11 1”,与我的教授在练习笔记中得到的结果相匹配。
但是,当我尝试解压缩消息时,会发生以下事件序列:
Current: a ; Next: b ; Output: a ; AddToDict: ab=4;
Current: b ; Next: a ; Output: b ; AddToDict: ba=5;
Current: ab ; Next: c ; Output: ab ; AddToDict: abc=6;
Current: c ; Next: ba ; Output: c ; AddToDict: cb=7;
Current: ba ; Next: 8? ; Output: ? ; AddToDict: ?;
如您所见,我的问题是字典中还没有8(应该是“ bab”)。
我在做什么错了?
从压缩中获得的完整字典是
(1 = a; 2 = b; 3 = c; 4 = ab; 5 = ba; 6 = abc; 7 = cb; 8 = bab; 9 = baba; 10 = aa; 11 = aaa; 12 = aaaa)
解决方法
您应该小心!第一列是“当前序列”,而第二列是“下一个字符”(不是“下一个序列”)。因此,编写“ next:ba”时您有一个错误。顺便说一句,直到最后一行都是正确的:
Current: ba ; Next: b ; Output: ba ; AddToDict: bab = 8; // here is 5
Current: bab ; Next: a ; Output: bab ; AddToDict: baba = 9; // here you can find 8
Current: a ; Next: a ; Output: a ; AddToDict: aa = 10; // here is 1
Current: aa ; Next: a ; Output: aa ; AddToDict: aaa = 11; // here is 10
Current: aaa ; Next: a ; Output: aaa ; AddToDict: aaaa = 12; // here is 11
Current: a ; Next: # ; Output: a ; # // here is 1
,
您在考虑Current Next
。我根据Previous Current
查看解码。因此,请注意,在阅读此答案时,Current
是消息中的当前号码(请参见下表中标记为Current
的列,并注意其中包含要解码的消息)。
请注意,根据我的定义,由于没有Previous
代码,因此必须将消息的第一个代码视为特殊情况。消息中的第一个代码始终是单个字母代码,并且在处理该代码时不会创建字典条目。
对于消息中的所有其他代码,有两种可能性:
-
典型值:
Current
代码具有字典条目。在这种情况下,输出是Current
代码的字典字符串。通过将Previous
代码的字符串作为字符串,并在Current
代码的字符串中附加第一个字母,形成新的字典字符串。 -
古怪:
Current
代码尚无字典条目。在这种情况下,输出是Previous
代码的字符串,加上Previous
代码的字符串的第一个字母。通过将Previous
代码的字符串作为字符串,并在Previous
代码的字符串中附加第一个字母,形成新的字典字符串。
请记住,以下是消息的解码方式:
Previous Current Output Dictionary Type
- 1 a - special
1 2 b 4: ab typical
2 4 ab 5: ba typical
4 3 c 6: abc typical
3 5 ba 7: cb typical
5 8 bab 8: bab quirky: dict[5] is "ba" plus first letter of dict[5] is "b" means dict[8] is "bab"
8 1 a 9: baba typical
1 10 aa 10: aa quirky
10 11 aaa 11: aaa quirky
11 1 a 12: aaaa typical
在古怪的情况下请注意,输出和新词典条目相同。它们是专用于Previous
代码的信息生成的。解码古怪的情况时,Current
代码将被忽略,新的字典条目就是Current
代码的条目。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。