Elias-Fano编码算法——倒排索引压缩用,本质上就是桶排序数据结构思路
Elias-Fano编码过程如下:把一组整数的最低l位连接在一起,同时把高位以严格单调增的排序划分为桶。
Example: 2, 3, 5, 7, 11, 13, 24
Count in unary the size of upper bits “buckets” including empty ones:110=》计算最大的桶,此处是110,计算方法如下:
Maximum bucket: [U / 2^l]
Example: [24 / 2^2] = 6 = 110
连接最低位:
Concatenate lower bits
10110111110100
最终编码如下:
Elias-Fano representation of the sequence
11011010100010 10110111110100
解释下为啥是这样的结果?
000的桶是2个数(10,11),2的unary编码是110
001的桶是2个数(01,11),2的unary编码是110
010的桶是1个数(11),1的unary编码是10
011的桶是1个数(01),1的unary编码是10
100的桶是0个数,0的unary编码是0
101的桶是0个数,0的unary编码是0
110的桶是1个数(00),1的unary编码是10
将上述编码连接起来就是:11011010100010
最后连接低位编码:10110111110100
合起来最终编码就是:11011010100010 10110111110100
图中的序列为2,3,5,7,11,13,24,如果期望定位大于6的位置,那么根据6/2^2就可以定位到大于6的桶,然后在桶内线性扫描即可。可以看到,低l位的存在,就是起到了桶定位的用途,从而避免全部解压,这可以类比于常规索引中的跳跃表,跳跃间隔为2^l。
Quasi-succinct索引在MG4J的开源搜索引擎中得到了应用。
升级的Elias-Fano编码算法:Partitioned(分区块) Elias-Fano编码,这篇文章获得了2014年SIGIR会议最佳论文,它是针对Elias-Fano编码进行的改进。仍然由Quasi-succinct的作者提出,主要解决Quasi-succinct索引的压缩率问题——回归区块压缩手段,把数字序列划分区块,每个区块内单独用Elias-Fano编码,同时,为了确保仍然具备随机访问的特性,把区块的边界数字再次单独拿Elias-Fano编码压缩,因此形成了一个二级结构。根据作者的试验,分区Elias-Fano编码比最快的PForDelta编码OptPFor速度和压缩率上均有超越,但压缩率大大超过后者(2倍以上)。因此,在随机访问,压缩率,解压性能上达到了很强的综合性能,荣膺最佳论文实至名归。
参考:
原始论文地址在:http://www.di.unipi.it/~ottavian/files/elias_fano_sigir14.pdf
| C Size | ratio% | Bits/Integer | C MI/s | D MI/s | Name |
|---|---|---|---|---|---|
| 62939886 | 15.7 | 5.04 | 397 | 2311 | TurboPFor256 |
| 63392759 | 15.8 | 5.07 | 330 | 1608 | TurboPFor |
| 63392801 | 15.8 | 5.07 | 332 | 231 | TurboPForDA |
| 65060504 | 16.3 | 5.20 | 15 | 687 | FP.SIMDOptPFor |
| 65359916 | 16.3 | 5.23 | 8 | 609 | PC.OptPFD |
| 73477088 | 18.4 | 5.88 | 102 | 621 | PC.Simple16 |
| 73481096 | 18.4 | 5.88 | 156 | 2187 | FP.SimdFastPFor 64k * |
| 76345136 | 19.1 | 6.11 | 245 | 653 | VSimple |
| 91956582 | 25.5 | 8.15 | 65 | 2141 | QMX 64k * |
| 95915096 | 24.0 | 7.67 | 212 | 958 | Simple-8b |
| 99910930 | 25.0 | 7.99 | 3494 | 2968 | TurboPackV |
| 99910930 | 25.0 | 7.99 | 2367 | 2351 | TurboPack |
| 99910930 | 25.0 | 7.99 | 2105 | 2219 | TurboFor |
| 100332929 | 25.1 | 8.03 | 3580 | 2998 | TurboPack256V |
| 101015650 | 25.3 | 8.08 | 2380 | 2371 | TurboVByte |
| 102074663 | 25.5 | 8.17 | 1428 | 1979 | MaskedVByte |
| 102074663 | 25.5 | 8.17 | 565 | 1052 | PC.Vbyte |
| 102083036 | 25.5 | 8.17 | 1300 | 1067 | FP.VByte |
| 112500000 | 28.1 | 9.00 | 382 | 3035 | VarintG8IU |
| 125000000 | 31.2 | 10.00 | 1111 | 2948 | StreamVbyte |
| 400000000 | 100.00 | 32.00 | 2240 | 2237 | Copy |
| N/A | N/A | EliasFano |
Elias-Fano编码算法——倒排索引压缩用,本质上就是桶排序数据结构思路的更多相关文章
- 排序算法的C语言实现(上 比较类排序:插入排序、快速排序与归并排序)
总述:排序是指将元素集合按规定的顺序排列.通常有两种排序方法:升序排列和降序排列.例如,如整数集{6,8,9,5}进行升序排列,结果为{5,6,8,9},对其进行降序排列结果为{9,8,6,5}.虽然 ...
- 利用反射快速给Model实体赋值 使用 Task 简化异步编程 Guid ToString 格式知多少?(GUID 格式) Parallel Programming-实现并行操作的流水线(生产者、消费者) c# 无损高质量压缩图片代码 8种主要排序算法的C#实现 (一) 8种主要排序算法的C#实现 (二)
试想这样一个业务需求:有一张合同表,由于合同涉及内容比较多所以此表比较庞大,大概有120多个字段.现在合同每一次变更时都需要对合同原始信息进行归档一次,版本号依次递增.那么我们就要新建一张合同历史表, ...
- 线性时间的排序算法--桶排序(以leetcode164. Maximum Gap为例讲解)
前言 在比较排序的算法中,快速排序的性能最佳,时间复杂度是O(N*logN).因此,在使用比较排序时,时间复杂度的下限就是O(N*logN).而桶排序的时间复杂度是O(N+C),因为它的实现并不是基于 ...
- Java算法 -- 桶排序
桶排序(Bucket sort)或所谓的箱排序,是一个排序算法,工作的原理是将数组分到有限数量的桶里.每个桶再个别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序).桶排序是鸽巢排序 ...
- go实现堆排序、快速排序、桶排序算法
一. 堆排序 堆排序是利用堆这种数据结构而设计的一种排序算法.以大堆为例利用堆顶记录的是最大关键字这一特性,每一轮取堆顶元素放入有序区,就类似选择排序每一轮选择一个最大值放入有序区,可以把堆排序看成是 ...
- 【算法】桶排序(Bucket Sort)(九)
桶排序(Bucket Sort) 桶排序是计数排序的升级版.它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定.桶排序 (Bucket sort)的工作的原理:假设输入数据服从均匀分布,将 ...
- Android数据加密之Base64编码算法
前言: 前面学习总结了平时开发中遇见的各种数据加密方式,最终都会对加密后的二进制数据进行Base64编码,起到一种二次加密的效果,其实呢Base64从严格意义上来说的话不是一种加密算法,而是一种编码算 ...
- deep learning 自编码算法详细理解与代码实现(超详细)
在有监督学习中,训练样本是有类别标签的.现在假设我们只有一个没有带类别标签的训练样本集合 ,其中 .自编码神经网络是一种无监督学习算法,它使用了反向传播算法,并让目标值等于输入值,比如 .下图是一个自 ...
- 【字符编码】字符编码 && Base64编码算法
一.前言 在前面的解决乱码的一文中,只找到了解决办法,但是没有为什么,说白了,就是对编码还是不是太熟悉,编码问题是一个很简单的问题,计算机从业人员应该也必须弄清楚,基于编码的应用有Base64加密算法 ...
随机推荐
- Android开发初体验
本文通过开发一个应用来学习Android基本概念及构成应用的UI组件. 开发的应用名叫GeoQuiz,它能给出一道道地理知识问题.用户点击true或false按钮回答问题,应用即时做出反馈 第一步请先 ...
- 【译】x86程序员手册06 - 2.4指令格式
2.4 Instruction Format 指令格式 The information encoded in an 80386 instruction includes a specification ...
- Oracle、Db2、SqlServer、MySQL 数据库插入当前系统时间
做易买网项目,由于对数据库插入系统时间不了解,常常遇到的问题: 1.java.sql.SQLException: ORA-01861: 文字与格式字符串不匹配.原因:由于获取系统时间类型不对,应为sy ...
- python round()模块
Python3的round()函数四舍五入取整时,采用最近偶数原则 >>> round(1.5)2>>> round(2.5)2>>> round ...
- Spring MVC 笔记2 HelloWorld
实现这个例子的问题 WEB-INFO目录下必须有spring的包,放在lib下:如下图(这里我直接把idea创建时宣称springmvc,然后把idea给的lib拷贝了下来,也可以的) request ...
- 【7】Django网页视图模板处理
天下难事必作於易.天下大事必作於细.是以圣人终不为大,故能成其大 --老子<道德经> 本节内容 HTML页面的渲染 使用页面模板 异常处理 超链接路径处理 路由命名空间 1. HTML页面 ...
- SFTP文件上传下载
http://www.cnblogs.com/longyg/archive/2012/06/25/2556576.html (转载)
- vue 实现点赞
在v-for循环里 <ul class="project_content"> <li v-for="(item, index) in items&quo ...
- hadoop在线退役datanode
退役dn2echo "dn2" >>excludes echo "dn2" >>yarn-excludes sh refresh-nam ...
- sha2 替换sha1 时间表
由于sha1签名算法进入淘汰阶段,逐渐弃用中,sha1升级为sha2是大势所趋. 微软已经正式发布sha1弃用策略: http://blogs.technet.com/b/pki/archive/20 ...