Algorithm 理解LZW算法解压的困难
我使用LZW压缩算法压缩了以下消息:“ababcbabaaaaaa” a=1;b=2;c=3我得到以下信息:“123558110111”,这与我的教授在我们的练习笔记中得到的结果相符 但是,当我尝试解压缩消息时,会得到以下事件序列:Algorithm 理解LZW算法解压的困难,algorithm,compression,information-theory,lzw,Algorithm,Compression,Information Theory,Lzw,我使用LZW压缩算法压缩了以下消息:“ababcbabaaaaaa” a=1;b=2;c=3我得到以下信息:“123558110111”,这与我的教授在我们的练习笔记中得到的结果相符 但是,当我尝试解压缩消息时,会得到以下事件序列: Current: a ; Next: b ; Output: a ; AddToDict: ab=4; Current: b ; Next: a ; Output: b ; AddToDict: ba=5; Current: ab ; Next: c
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
你应该小心!第一列是“当前序列”,但第二列是“下一个字符”(不是“下一个序列”)。因此,您在编写“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
是消息中的当前编号(请参阅下表中标记为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
请注意,在这种奇怪的情况下,输出和新字典条目是相同的。它们仅使用以前的代码中的信息生成。当解码奇怪的情况时,Current
代码被忽略,而新的字典条目是Current
代码的条目。您在思考Current Next
。我根据以前的当前值查看解码。因此,在阅读此答案时,请注意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
请注意,在这种奇怪的情况下,输出和新字典条目是相同的。它们仅使用以前的代码中的信息生成。当解码奇怪的情况时,Current
代码被忽略,新的字典条目是Current
代码的条目