LZ78实施

时间:2018-03-08 15:19:25

标签: algorithm encoding compression lempel-ziv-76

快速但足够的LZ78定义来自维基百科:

  

每个字典条目的格式为字典[...] = {index,   character},其中index是前一个字典条目的索引,   和字符附加到由...表示的字符串   字典[指数]。例如,将存储“abc”(反之亦然)   顺序)如下:字典[k] = {j,'c'},字典[j] = {i,'b'},   dictionary [i] = {0,'a'},其中索引为0指定第一个   字符串的字符。该算法初始化最后匹配索引 =   0和下一个可用索引 = 1。

     

对于输入的每个字符   流,搜索字典匹配:{最后匹配索引,   字符}。

     
      
  • 如果找到匹配项,则最后匹配的索引设置为   匹配条目的索引,没有输出。

  •   
  • 如果匹配的话   找不到,然后创建一个新的词典条目:字典[ next   可用索引] = {最后匹配索引,字符}和算法   输出最后匹配的索引,后跟字符,然后重置 last   匹配索引 = 0并递增下一个可用索引。一旦   字典已满,不再添加条目。

  •   
  • 当结束时   到达输入流,算法输出最后匹配的索引。

  •   

在考虑实施时,最后一句话对我来说是一个严重的问题。 好的,输出流的形式是(索引,字母)......(索引,字母)(索引)。

但是,由于任何实现都需要使用字节(或类似的并不重要)在一般情况下我们有一个填充。那么如何让解码器不被填充愚弄呢?

我知道存在一些技巧,例如,如果我有原始字符串的总长度,那么很容易停止解码器。但是,在这种情况下,LZ78不再是流压缩器。另一个例子是扩展字母表以便为终端案例提供一个特殊的字符,但是这将使用至少一个字母编码位,这对我来说是不可接受的。同样,如果字符集包含所有可能的字节,则没有问题,因为任何输出步骤都会生成至少8位(索引+字母),因此很容易知道我们是否在最后。

但是在LZ78的一般情况下,您可以使用任何字母表。例如,如果字母表只有两个元素0和1,我无法理解如何不被填充愚弄。我的意思是如何区分(索引,填充)和(索引,字母)?

如何区分00和000的编码?

  • (0,0)(1)+填充(原始:001 +填充)
  • (0,0)(1,0)+填充(原始:0010 +填充)

我错过了一个非常简单的观点吗?

请注意,即使是来自Lempel& Sons的原始文件也是如此。 Ziv对此一无所知。我发现和分析的所有实现都使用了我列出的一个技巧(或变体)。

0 个答案:

没有答案