smaz压缩库如何工作?

时间:2015-10-25 15:40:19

标签: algorithm redis compression lzw

我目前正在为基于我语言的短文本压缩项目工作。但作为初学者,我也知道一些像LZW这样的基本压缩算法。但我仍然不明白smaz是如何运作的。我有两个问题:

  1. smaz如何运作?
  2. 如何构建码本和反向码本?
  3. 任何人都能为我解释一下吗?

    非常感谢。

2 个答案:

答案 0 :(得分:1)

试图回答您的问题

smaz是如何工作的? 根据{{​​3}},

  

Smaz具有254种常用英语的固定常量内置密码本   单词,单词片段,双字母组和小写字母(j除外,   k,q)。 Smaz解码器的内部循环非常简单:

     
      
  • 从压缩文件中获取下一个字节X。      
        
    1. X == 254吗?单字节文字:获取下一个字节L,并将其直接传递给解码的文本。
    2.   
    3. X == 255吗?文字字符串:获取下一个字节L,然后将接下来的L + 1个字节直接传递给解码的文本。
    4.   
    5. X的其他任何值:在密码本中查找第X个“单词”(该“单词”可以是1到5个字母),然后将该单词复制到解码后的   文字。
    6.   
  •   
  • 重复执行,直到压缩文件中不再有压缩字节为止。
  •   
     

由于密码本不变,因此Smaz解码器无法   “学习”新单词并压缩它们,无论它们出现的频率如何   在原始文本中。

[1]可能有助于理解代码。

如何构建密码本和反向密码本? 仓库中有page个文件,作者TODO则表示字典是由未发布的ruby脚本生成的。另外,作者解释:

  

再说一遍,Ruby程序所做的就是考虑所有可能的子字符串,甚至所有可能的分隔词,并构建一个   频率表,而不是根据字符串调整权重   长度,最后手动调整表以压缩特定内容   很好。例如,我手动添加了“ http://”和“ .com”令牌,   删除最后两个条目。

您的项目的替代方案可以是comments,它支持根据您的语言生成自定义压缩模型。

答案 1 :(得分:0)

smaz sources只有178行,只有99行没有注释和代码簿表。你应该看看它是如何工作的。

Smaz是一种非常简单的码本压缩方法(比如LZW,你知道)。该库包含最流行的英语术语表(压缩表为5 - 51行,解压缩为56 - 76),并用压缩字符串中的索引替换此术语。与减压相反。

例如,如果术语the end是压缩表中的一个字节索引,则字符串the将压缩58%。所以7个字节的长度字符串变成了4个字节长度的字符串。