《这就是搜索引擎》一元编码勘误,兼谈Elias Gamma系列算法

本文深入探讨了《这就是搜索引擎》中关于索引压缩的章节,纠正了一元编码、EliasGamma和EliasDelta编码的描述错误,详细解析了Elias系列编码的工作原理及其在数字压缩中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

《这就是搜索引擎》整体来看还是适合作为搜索引擎知识的入门书的。但是有些章节的描述错误,实在有伤大雅!

书籍信息:《这就是搜索引擎》作者:张俊林 2012年1月第1版

一元编码

第4章『索引压缩』的4.2节提到了一元编码(unary code)和二进制编码(binary code)。首先关于一元编码的这个插图便是错的。

640?wx_fmt=jpeg

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

640?wx_fmt=jpeg

也就是说数字是几就有几个1。

Elias Gamma(Elias γ)

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

640?wx_fmt=jpeg

Elias Gamma 利用分解函数将待压缩数字分解为两个因子,之后分别采用一元编码和二进制编码来编码这两个因子。

文中提到Elias Gamma 分解函数,其实没错:

640?wx_fmt=other

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

640?wx_fmt=jpeg

那么对于:640?wx_fmt=other 。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。640?wx_fmt=gif

 

Google Doodle: First Image of a Black Hole

 

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

果冻虾仁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值