有人可以向我解释Lempel-Ziv 76的复杂性吗?我的印象是你用字典中字符串的第一个字母初始化,然后在前一个子字符串中检查后续块是否存在,每次找到子字符串时都会生成一个字母。如果前一个子字符串中不存在子字符串,则该子字符串称为块,下一个字母将成为要搜索的下一个子字符串。
例如,
01011010001101110010
0|1
因为1不在0,我们得到0|1|0
因为0在01,我们得到0|1|01
因为01在01,我们得到0|1|011|0
因为0在01011,我们得到0|1|011|01
因为01是在01011,我们得到0|1|011|010
由于010在01011,我们得到0|1|011|0100|0
等等,直到我们得到0|1|011|0100|011011|1001|0
,
如有必要,最后一个字母可以重复。
我做错了什么?因为我被告知对于字符串1111111,分解是1 | 111111。谢谢!
答案 0 :(得分:3)
我同意你的分解:
01011010001101110010 - > 0.1.011.0100.011011.1001.0
我也相信你被告知的是正确的:
1111111 - > 1.111111
但是,你如何达到原来的分解是不对的!因此,关于分解1111111的困惑。我认为,根据你的推理:
1111111 - > 1111年1月11日
我很确定不正确。
对现有单词序列(块)的扩展并不像检查扩展名先前是否显示为先前历史记录的子字符串那样简单。归结为Lempel和Ziv在他们的论文关于有限序列的复杂性中描述的扩展的再现性的概念(我假设你正在工作的是什么)从!)。形成扩展,使得它是来自先前历史的不可再现的最短单词。他们描述的扩展的再现性概念相当复杂,但它归结为能够在之前的历史中找到起始位置,从中可以顺序地将符号从该起始位置复制到历史的末尾,形成扩展。
从原始序列开始,假设符号的位置为1到20.第一个符号始终是一个单词/块:
0
下一个扩展程序无法从以前的历史记录中重现:
0 1
下一个扩展名是:
0.1。 011
它不能为0或01的原因如下:通过从位置1复制一个符号到结尾,可以从先前的历史再现0;通过从位置1到末尾复制两个符号,可以再现01; 011不可再现。
下一个扩展名是:
通过从位置1到末尾复制一个符号,可以重现0;通过从位置1到末尾复制两个符号,可以再现01;通过从位置1到末尾复制三个符号,可以重现010; 0100不可再现。0.1.011。 0100
等等。
1111111的分解如下:第一个符号本身就是一个块:
1
下一个扩展名是:
通过将一个符号从位置1复制到前一个历史的末尾,可以重现1。的111111
1。通过从位置1到末尾复制两个符号,可以再现图11中的符号。这是它变得复杂的地方 - 在这种情况下,当您复制两个符号时,副本的来源实际上延伸到前一个历史的末尾!换句话说,您复制的第二个1实际上是将第一个1复制到结尾的扩展的一部分。类似地,由于这种递归复制过程,111,1111,11111,1111111都是可再现的。但是,由于我们现在已经到达原始序列的末尾,因此最后一次扩展被认为是111111。
希望我的解释有一些道理。
答案 1 :(得分:1)
This paper不同意您对算法的描述。根据该文章,如果它与以前的任何分区都不匹配,则会有一个新分区。您没有像完成那样基于整个未分区的前一个序列来创建分区。所以对于你的例子(我正在使用。而不是分区,因为这更容易阅读):
01011010001101110010
分区为:
0.1.01.10.100.011.0111.00.10
所以LZ76的重量是9(而不是7)。
1111111
分区为:
1.11.111.1
它们都提供了最后一个分区包含在前一个分区中的示例。因此< r而不是定义中的< = r。
我没有原始论文,所以我无法检查这篇论文是否错了。但是我怀疑他们错误地从原始论文中复制了这个定义。