1.9 Lempel-Ziv算法
霍夫曼编码需要符号的概率。但许多日常生活现象并不预先提供符号的概率(如信源的统计特性未知)。原则上通过对信源的输出进行长时间观察,可以估计出符号的概率。但在实用中这是不现实的。另外,霍夫曼编码对DMS,也就是当一个符号的出现不会影响到后续符号的出现概率时是***的,但对有记忆信源这就不是***的选择。例如考虑书写文字的压缩问题。我们知道许多字母成对或成组出现,如“q-u”、“t-h”、“i-n-g”等。用字母间的统计互相关性连同字母各自的出现概率应该会更有效。这就是Lempel和Ziv在1977年提出的方案。他们的信源编码算法不需要信源的统计特性。这是一种变长到定长信源编码算法,属于广义信源编码算法类。
Lempel-Ziv广义编码隐含的逻辑如下:通过对由一连串的0和1组成的预先串(前缀串),另加一个新的比特进行编码,对任意比特序列的压缩是可能的。然后,由原来的前缀串添加一个新的比特所形成的新串又作为未来串的前缀串。这些变长的组叫做短语。这些短语列在一个字典里,其中记录了已存在的短语和它们的位置。当对一个新的短语编码时,我们指明已有的短语在字典中的位置并附加新字母。我们可以通过下面的例子来更好地理解Lempel-Ziv算法是怎么工作的。
例1.18 假定我们想对串101011011010101011编码。我们首先做语法分析,将它变成一些用逗号分开的短语,它们代表的字符串可以用原来的一个字符串作前缀另加一个比特表示。
***个比特是1,它前面没东西,因此它有一个***缀串而且另外的1比特就是它自己: