快速但足够的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的编码?
我错过了一个非常简单的观点吗?
请注意,即使是来自Lempel& Sons的原始文件也是如此。 Ziv对此一无所知。我发现和分析的所有实现都使用了我列出的一个技巧(或变体)。