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代码的条目。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...