《这就是搜索引擎》整体来看还是适合作为搜索引擎知识的入门书的。但是有些章节的描述错误,实在有伤大雅!
书籍信息:《这就是搜索引擎》作者:张俊林 2012年1月第1版
一元编码
第4章『索引压缩』的4.2节提到了一元编码(unary code)和二进制编码(binary code)。首先关于一元编码的这个插图便是错的。

其实一元编码,看英文就知道,unary code可以理解为『一进制编码』。所以数字是几就有几个1。作为编码方案,末尾追加一个0表示数字的终止,用以确定边界。实际应如下图:

也就是说数字是几就有几个1。
Elias Gamma(Elias γ)
再来看下4.2.3节的Elias Gamma算法。Elias Gamma是Peter Elias提出的数字压缩算法。其中会用到一元编码,由于前面对一元编码的错误描述,导致Elias Gamma算法也不可避免的错误。原文如下:

Elias Gamma 利用分解函数将待压缩数字分解为两个因子,之后分别采用一元编码和二进制编码来编码这两个因子。
文中提到Elias Gamma 分解函数,其实没错:

后面的描述错了,并不是针对e+1进行一元编码。而是针对e进行一元编码。但是实际Elias Gamma采用的一元编码和刚才说的有点不同,就是Elias Gamma的一元编码用的是1做终止符,用0表示数字的内容。也就是(参考维基百科)【阅读原文,发现链接】:

那么对于:
。e=3,d=1。对于3采用一元编码,1采用二进制编码,然后拼接,最终9的Elias Gamma编码为:0001001。
延伸一下,解码的时候该如何解码呢?书中并未提到。其实不难。就是从头开始读入0,直到读到1,即为e。如果有N个0,那么在从1后面继续读N个bit,得到d。所以可以看出Elias编码的bit位数都是奇数。
Elias Delta(Elias δ)
其实书中对于Elias Delta算法的概述没错。就是得到Elias Gamma的的因子e后,再针对e+1做一次Elias Gamma编码。当然作为Elias Gamma的升级算法,Elias Delta在书中的计算结果自然也错了。
对于9,e=3。针对3+1即4再做一次Elias Gamma编码得到:00 1 00,再拼接d。得到最终的9的Elias Delta编码值为:00 1 00001
另外Elias编码系列还有一种书中未提到的编码是:Elias Omega(Elias ω)。不过和前面两种算法计算方法差别比较大,大家自己去维基百科阅读:Elias omega coding【阅读原文,发现链接】
Elias 系列编码解决了什么问题
看到很多网友说:Elias Gamma没有实现压缩啊,用了一进制的一元编码,数字反而变长了。
其实不是的。要知道计算机存储二进制的数字信息都是定长的(上边界确定的)。比如C语言一个int在64位计算机是4个字节,32个bit。所以即使是数字0,它存的时候也是32个bit的0。
Elias编码解决的是数字范围的上边界不定长时候的存储。当然Elias Gamma算法还是在数字范围都比较小的时候才比较有效!
另外看了这些编码都是正数啊,怎么表示负数和0。这可以采用双摄(Bijection)来解决。即这些正数不再表示字面数值,而是再映射一次:(0, 1, −1, 2, −2, 3, −3, ...)。就像Protobuffer采用的ZigZag。
Google Doodle: First Image of a Black Hole
本文深入探讨了《这就是搜索引擎》中关于索引压缩的章节,纠正了一元编码、EliasGamma和EliasDelta编码的描述错误,详细解析了Elias系列编码的工作原理及其在数字压缩中的应用。

被折叠的 条评论
为什么被折叠?



