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加密算法 ...
随机推荐
- iOS CoreData 开发
新年新气象,曾经的妹子结婚了,而光棍的我决定书写博客~ 废话结束. 本人不爱使用第三方的东东,喜欢原汁原味的官方版本,本次带来CoreData数据存储篇~ 创建应用
- 【译】x86程序员手册07 - 2.5操作数选择
2.5 Operand Selection 操作数选择 An instruction can act on zero or more operands, which are the data mani ...
- @ResponseBody 返回中文乱码
第一种解决方法:在@RequestMapping注解添加produces属性 @RequestMapping(value = "testPersonalValidtor.do",p ...
- css的基本单词
<border>边框 border边框 <text>文本 text文本 <indent>缩进 indent缩进 <align>对齐方式 align对齐方 ...
- java中“53”个关键字(含2个保留字)
1.java的关键字(keyword)有多少个? 51+2个保留字=53个关键字(java的关键字都是小写的!!) 2.java的保留字(reserve word)有多少个?问题:分别是什么? 2个保 ...
- 扩增子图表解读4曼哈顿图:差异分类级别Taxonomy
曼哈顿图 Manhattan Plot 曼哈顿图本质上是一个散点图,用于显示大量非零大范围波动数值,最早应用于全基因组关联分析(GWAS)研究展示高度相关位点.它得名源于样式与曼哈顿天际线相似(如下图 ...
- 微信小程序video监测播放进度
video组件提供的进度相关的监测只有 bindtimeupdate ,官方说明这个函数250ms触发一次,在开发者工具上基本符合,但在真机上每隔1秒触发一次.达不到我们要求的精度.对比下音频,wx. ...
- js案例分析
名字取的高大上,其实只是我平时上网浏览遇到的一些我感觉还不错的小题目,再加上我或者是我在网上找到的一些理解,就保存到这里了. 2019/4/2 最新开了个新坑,是一个javascipt30的一些案例 ...
- 学习MPI并行编程记录
简单的MPI程序示例 首先,我们来看一个简单的MPI程序实例.如同我们学习各种语言的第一个程序一样,对于MPI的第一个程序同样是"Hello Word". /* Case 1 he ...
- GitHub:创建和修改远程仓库
创建远程仓库 首先在GitHub上创建一个仓库命名为learngit.选中public(private要钱),选中 生成README(就是markdown形式的说明文档),便于别人和自己了解仓库的作用 ...