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加密算法 ...
随机推荐
- React Native状态机和应用设计思路
React Native状态机和应用设计思路 在原生Android开发中:当用户点击“登录”按钮时,从用户名输入框中读取用户输入的用户名,从密码输入框中读取用户输入的密码,然后交给注册模块去处理.但是 ...
- CSS——padding
padding是盒子内容与边框的距离. padding:10px;/*上下左右都是10px*/ padding:10px 20px;/*上下是10px 左右是20px*/ padding:10px 2 ...
- 常用MySQL语句整合
常用MySQL语句整合 1. MySQL服务的配置和使用 修改MySQL管理员的口令:mysqladmin –u root password 密码字符串 如:mysqldmin –u root pas ...
- XML在线转化为JSON
http://www.utilities-online.info/xmltojson/
- js 滚动条
<script type="text/javascript"> //文档高度1016 包含隐藏的margin和padding 实际1000 //文档1000 //窗口高 ...
- day03-执行python方式、变量及数据类型简介
目录 执行Python程序的两种方式 1. 第一种:交互式 2. 第二种:命令式 3. Python执行程序的三个阶段 变量 变量 什么是变量 Python中的变量 变量名的命名规范 内存管理 定义变 ...
- strcmp 与 _tcscmp
strcmp 用来比较ANSI字符串,而_tcscmp用来比较UNICODE(宽字符)的字符串.ANSI字符串中,1个英文字母为1个字节,1个中文字符为2个字节,遇到0字符表示字符串结束.而在UNIC ...
- leetcode刷题记录--js
leetcode刷题记录 两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但 ...
- Gym - 101611D Decoding of Varints(阅读理解题 )
Decoding of Varints 题意&思路: 首先根据红色边框部分的公式算出x,再有绿色部分得知,如果x是偶数则直接除以2,x是奇数则(x+1)/-2. PS:这题有数据会爆掉un ...
- SQL上门
学习这个 介绍:SQL 是用于访问和处理数据库的标准的计算机语言.结构化化查询语言! SQL可以分为两大部分:数据操作语言(DML)和数据定义语言(DDL) 数据操作语言:select.update. ...