Algorithm 理解LZW算法解压的困难

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

我使用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  ; 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
代码的条目