这就是搜索引擎--读书笔记七--倒排列表压缩算法

倒排列表压缩算法

目前有很多种倒排列表算法可以选择,但是我们对评判算法的优劣需要定量指标。一般会考虑3个指标:压缩率、压缩速度以及解压速度。

压缩率是指数据压缩前和压缩后大小的比例,显然,压缩率越高,就越节约磁盘空间。而压缩速度是压缩单位量的数据所花的时间,但是压缩往往是在建立索引过程中进行的,这是一个后台进行的过程,不需要及时响应用户查询,即使速度慢一些也没有关系。所以普遍来说,压缩速度不是一个重要指标。

那么我们来看看解压速度。顾名思义,解压就是将压缩数据恢复到原始数据。这是一个实时响应过程。用户在运用搜索引擎查询的时候,搜索引擎从磁盘读入的数据是压缩的,需要实时解压然后快速响应给用户,所以这个时间是我们在百度搜索网页时等待的时间,其重要性不言而喻吧。

一元编码和二进制编码

这个是所有倒排列表压缩算法的基础构成元素。一元编码是非常简单直观的数据表示方式,我们对于一整数X来说,使用X-1个二进制数字1和末尾一个0来表示这个数字,比如5对应的一元编码就是11110, 3对应的一元编码就是110,但是相信大家都看出来了,这种一元编码对于处理大整数来说是非常不划算的。二进制编码不用多说了吧,就是一个整数的二进制表示法。

Elias Gamma算法和Elias Delta算法

Elias Gamma压缩算法利用分解函数将待压缩的数字分解为两个因子,之后分别用一元编码和二进制编码来表示这两个因子(刚才都说了嘛,一元编码和二进制编码是这些算法的基础构件)。

该算法的分解函数:X = 2e + d

其中,X为待压缩的数字,e和d分别为其因子,得到其因子后,我们对于因为e+1采用一元编码来表示,对于因子d采用比特宽度为e的二进制来表示。比如X为9,那么X = 23 + 1 ,对于e+1也就是4得到的一元编码就是1110,对于d用比特宽度为3的二进制表示为001,将两者拼接为1110:001,这就是十进制数字9最后的Elias Gamma编码。

Elias Delta算法是建立在Elias Gamma算法基础上的改进,实际上就是实现两次Elias Gamma算法。我们对数字X采用Elias Gamma算法得到了e 和 d ,此时我们需要对e+1再次进行Elias Gamma编码表示,而d因子表示和Elias Gamma算法一样。比如上文提到的十进制数字9,第一次Elias Gamma算法得到了9 = 23 + 1 ,此时3+1需要再次Elias Gamma:3+1 = 22 + 0 ,因此,采用Elias Delta算法得到的十进制数字9的最终编码表示出来就是110:00:001。

Golomb算法和Rice算法

Golomb算法和Rice算法大致思路和上述两个Elias算法类似,即根据分解函数将待压缩数字分解为两个因子,分别用一元编码和二进制编码表示即可,不同之处在于采取了不一样的分解函数

对于Golomb 和 Rice 算法来说:因子1 = (X-1)/b    因子2 = (X-1)mod b

然后将因子1这个数值加上1之后采用一元编码压缩,因子2使用比特宽度为log(b)的二进制编码。

那么b应该取哪个值呢?这也是Golomb和Rice算法的不同之处。假设一个待压缩数列的平均值为Avg,那么Golomb算法就设定b=0.69*Avg,这里的0.69就是一个经验参数。而Rice算法就要求b得是2的整数次幂,同时b必须是小于Avg并且最近Avg的值。比如Avg是115的话,那么b就会设定为64;如果Avg为60的话,此时b就得为32,因为64超过Avg了。

变长字节算法

不知道大家对我上一次总结中的跳跃指针还有没有印象,它是把整个倒排列表分成了好几块,然后进行分块查询处理。这个算法的思想上和跳跃指针差不多,就是把整数拆分开。

变长字节算法以字节(即比特宽度为8)为一个基本存储单位,然而之前介绍的压缩算法,都是以比特位(Bit)作为基本存储单位。之所以称之为“变长字节”,是因为对于不用的数字来说,最后压缩编码后表示的结果所占用的字节数目不一定相同,可长可短。

我们在用这个算法压缩数据的时候,为了确定两个连续数字压缩后的边界,需要利用字节中一个比特位作为边界判断。一般情况下,如果边界判断设定为0,则可以认为这个字节是数字压缩编码的最后一个字节,而如果是1,则说明后续的字节仍然是属于当前的压缩数据数字。所以每个字节里,第一个比特位是用来做边界判断,后面7个比特位采用二进制编码来存储压缩的数据,即每个字节只可以存储的数值范围为0~127。

下图表示十进制数字33549采用变长字节算法编码后的表示结果

PForDelta算法

PForDelta压缩算法是目前解压缩速度最快的一种倒排文件压缩算法。

该算法基本出发点就是尽可能一次性压缩和解压多个数值。对于待编码的连续K个数值(一般取128,即一次性压缩解压128个数值),找出其中10%比例的较大数,对剩下90%的数值采取一个设定的比特宽度,而10%的大数当做异常数据单独存储。假设一次性要压缩的数值序列为:24,40,9,13,31,67,19,44,22,10,即K取10,下图是PForDelta算法压缩以上数据序列后形成的静态结构,压缩后的数据可以划分为3块:异常数据存储区、常规数据存储区以及异常链表头。

下面详解一下这个例子:除了30%的3个大数外,最大的数值为31,所以为了能够表示这70%的数值,比特宽度需要设定为5,这个可以理解吧。该算法在常规数据存储区维护了异常大数的一个顺序链表,比如对于异常数值40,其常规数据存储区对应位置设定为3,含义是指跳过后面3个数值即是另外一个异常大数的位置,通过这样就将异常大数的位置信息保留下来,这样在解压的时候能够快速恢复原始数据。

异常链表头则存放一个指针,指向了异常链表的第一个数值的位置,本例中链表头的值为1,意即跳过后续一个常规数值即可获得第一个异常大数的位置,通过链表头,就可以将所有异常大数快速串联起来。

时间: 2024-10-13 16:21:57

这就是搜索引擎--读书笔记七--倒排列表压缩算法的相关文章

这就是搜索引擎--读书笔记四--索引基础

搜索引擎索引基础 前几天我阅读了搜索引擎索引这一章,发现倒排索引这一方法确实很巧妙和迷人,它包含的原理和设计方法很独到.所以接下来,我想把我学习到的索引方面的知识给大家讲解一下,总共分为三篇:索引基础.索引建立和更新.索引查询. 我们首先认识倒排索引基本概念 文档:一般搜索引擎的处理对象是互联网网页,而文档这个概念要更宽泛些,代表以文本形式存在的存储对象,相比网页来说,涵盖了更多形式,比如Word.PDF.HTML.XML等不同格式的文件都可以称为文档. 文档集合:由若干文档构成的集合称为文档集

这就是搜索引擎--读书笔记一

这就是搜索引擎 -- 读书笔记一 相信搜索引擎对于每一个爱好算法甚至爱好技术的IT人员都具有强烈的好奇心吧,因为搜索引擎在互联网中的地位实在是不可撼动.想象如果互联网没有了搜索引擎,那么我们平常技术上出现瓶颈了怎么办?甚至连普通的生活都离不开搜索,大学生的你订餐了吗? 搜索引擎已经发展为每个人上网都离不开的重要工具,其技术发展历程是怎样的呢?其基本目标是什么?核心技术问题又是什么呢?在接下来的一系列博文中,我会根据读书和自己的总结用平乏的语言来表达出来,希望对朋友们有所帮助.另外,博友们如果有好

这就是搜索引擎--读书笔记六--索引的查询

索引的查询处理 为搜索引擎构建索引,其目的是能更快速地提取与用户查询相关的文档信息,假设搜索引擎已经建立了索引,我们如何利用倒排索引来相应用户的查询呢?这一次的总结就是给大家分享一下搜索引擎对于用户查询的处理过程. 目前有两种常见的查询处理机制,一种称为一次一文档方式,另外一种称为一次一单词方式. 下面我们用一个具体例子来分别说明两种基本查询处理方式的运行机制.在这个例子里,假设用户输入的查询为“搜索引擎 技术”,而“搜索引擎”这个单词对应的倒排列表中,文档ID依次为{1,3,4},“技术”这个

这就是搜索引擎--读书笔记五--索引的建立与更新

索引的建立和更新 索引的建立 前一总结里说到,如果索引结构建立好了,可以提高搜索的速度,那么给定一个文档集合,索引是如何建立起来的呢?建立索引的方式有很多种,在这里我就书中提到的三种方法简单总结一下. 两遍文档遍历法 第一次文档遍历 第一次扫描文档集合时,并没有立即开始建立索引,而是收集一些的统计信息,比如文档集合包含的文档个数N.文档集合内包含的不同单词个数M以及每个单词在哪些文档中出现过的信息DF等等.将所有单词对应的DF值全部相加,就可以知道建立最终的索引需要多少内存了,然后在内存中将连续

这就是搜索引擎--读书笔记二

网络爬虫基础 前言 通用搜索引擎的处理对象就是互联网网页,目前网页数量以百亿计,所以搜索引擎首先面临的问题就是:如何能够设计出高效的下载系统,以将如此海量的网页数据传送到本地,在本地形成互联网网页的镜像备份. 网络爬虫即起此作用,它是搜索引擎系统中很关键也很基础的构建.本次总结以及接下来的几次总结主要给大家简单介绍一下与网络爬虫相关的技术.说到爬虫,又想到了Python,所以首先了解一下爬虫的简单机制,这样对学习Python爬虫会有很大的帮助. 通用爬虫框架 如图所示 这是一个通用的爬虫框架流程

这就是搜索引擎--读书笔记三

前言 考虑到上次的网络爬虫总结一文对基础的知识还没有介绍完整,所以今天花一点时间来补充上次的网络爬虫基础知识.这次给大家总结了两个方面的内容:暗网抓取和分布式爬虫.希望对阅读本文的博友们有所收获. 暗网抓取 物理学研究表明,在目前宇宙所有物质的总体质量中,星系等可见物质占其中的20%,不可探测的暗物质占据了总质量的80%.互联网中暗网可以与宇宙的暗物质相类比,而其所占网页的比例,更是远大于暗物质占宇宙质量的比例,大约百倍于目前的明网网页. 什么是暗网 所谓暗网,是指目前搜索引擎爬虫按照常规方式很

这就是搜索引擎--读书笔记八--检索模型与搜索排序

检索模型与搜索排序 前言 搜索结果排序是搜索引擎最核心的构成部分,很大程度上决定了搜索引擎的质量好坏以及用户接受与否.尽管搜索引擎在实际结果排序时融合了上百种排序因子,但最重要的两个因素还是用户查询和网页的内容相关性及网页链接情况.那么,我们得到用户搜索词之后,如何从内容相关性的角度上对网页进行排序输出呢? 判断网页内容是否与用户查询相关,这依赖于搜索引擎所采用的检索模型.搜索引擎的核心是判断哪些文档是和用户需求相关的,并按照相关程度排序输出,所以相关程度计算是将用户查询和文档进行匹配的过程,而

倒排列表压缩算法汇总——分区Elias-Fano编码貌似是最牛叉的啊!

来看看倒排索引压缩.压缩是拿CPU换IO的最重要手段之一,不论索引是放在硬盘还是内存中.索引压缩的算法有几十种,跟文本压缩不同,索引压缩算法不仅仅需要考虑压缩率,更要考虑压缩和解压性能,否则会解压太慢而起不到CPU换IO的作用.早期的索引设计里,在尝试了几十种编码之后,基本都确定性采用差分编码+可变长字节编码.差分的目的在于让索引的文档ID尽可能小,因为压缩小的整数总是比大整数更有效.在索引构建算法中,有一类工作叫做"文档重排",目的就是通过对文档索引顺序的重新排列,使得索引posti

搜索引擎基础概念(3)—— 倒排列表

倒排列表 倒排列表用来记录有哪些文档包含了某个单词.一般在文档集合里会有很多文档包含某个单词,每个文档 会记录文档编号(DocID),单词在这个文档中出现的次数(TF)及单词在文档中哪些位置出现过等信息,这样与一个文档相关的信息被称做倒排索引项(Posting),包含这个单词的一 系列倒排索引项形成了列表结构,这就是某个单词对应的倒排列表.图 1-1 是倒排列表的示意图,在文档集合中出现过的所有单词及其对应的倒排列表组成了倒排索引. 图1-1 倒排列表示意图 在实际的搜索引擎系统中,并不存储倒排