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

ppt介绍: www.di.unipi.it/~ottavian/files/partitioned_elias_fano_sigir14.pptx
 
源码路径:
作者的升级版算法和其他算法比较: https://github.com/ot/partitioned_elias_fano 
http://shonan.nii.ac.jp/seminar/029/wp-content/uploads/sites/12/2013/07/Sebastiano_Shonan.pdf 里面有facebook的实现 见:• Facebook: https://github.com/facebook/folly/
https://github.com/catenamatteo/eliasfano 和其他压缩编码的比较 包括:https://github.com/lemire/JavaFastPFOR
https://github.com/wolfgarbe/EliasFanoCompression/blob/master/EliasFanoCompression.cs csharp实现 不过有些许overflow错误 要加&0xff修复
https://github.com/powturbo/TurboPFor 各个压缩算法的比较 结果如下图,没有比较eliasfano:
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编码算法——倒排索引压缩用,本质上就是桶排序数据结构思路的更多相关文章

  1. 排序算法的C语言实现(上 比较类排序:插入排序、快速排序与归并排序)

    总述:排序是指将元素集合按规定的顺序排列.通常有两种排序方法:升序排列和降序排列.例如,如整数集{6,8,9,5}进行升序排列,结果为{5,6,8,9},对其进行降序排列结果为{9,8,6,5}.虽然 ...

  2. 利用反射快速给Model实体赋值 使用 Task 简化异步编程 Guid ToString 格式知多少?(GUID 格式) Parallel Programming-实现并行操作的流水线(生产者、消费者) c# 无损高质量压缩图片代码 8种主要排序算法的C#实现 (一) 8种主要排序算法的C#实现 (二)

    试想这样一个业务需求:有一张合同表,由于合同涉及内容比较多所以此表比较庞大,大概有120多个字段.现在合同每一次变更时都需要对合同原始信息进行归档一次,版本号依次递增.那么我们就要新建一张合同历史表, ...

  3. 线性时间的排序算法--桶排序(以leetcode164. Maximum Gap为例讲解)

    前言 在比较排序的算法中,快速排序的性能最佳,时间复杂度是O(N*logN).因此,在使用比较排序时,时间复杂度的下限就是O(N*logN).而桶排序的时间复杂度是O(N+C),因为它的实现并不是基于 ...

  4. Java算法 -- 桶排序

    桶排序(Bucket sort)或所谓的箱排序,是一个排序算法,工作的原理是将数组分到有限数量的桶里.每个桶再个别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序).桶排序是鸽巢排序 ...

  5. go实现堆排序、快速排序、桶排序算法

    一. 堆排序 堆排序是利用堆这种数据结构而设计的一种排序算法.以大堆为例利用堆顶记录的是最大关键字这一特性,每一轮取堆顶元素放入有序区,就类似选择排序每一轮选择一个最大值放入有序区,可以把堆排序看成是 ...

  6. 【算法】桶排序(Bucket Sort)(九)

    桶排序(Bucket Sort) 桶排序是计数排序的升级版.它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定.桶排序 (Bucket sort)的工作的原理:假设输入数据服从均匀分布,将 ...

  7. Android数据加密之Base64编码算法

    前言: 前面学习总结了平时开发中遇见的各种数据加密方式,最终都会对加密后的二进制数据进行Base64编码,起到一种二次加密的效果,其实呢Base64从严格意义上来说的话不是一种加密算法,而是一种编码算 ...

  8. deep learning 自编码算法详细理解与代码实现(超详细)

    在有监督学习中,训练样本是有类别标签的.现在假设我们只有一个没有带类别标签的训练样本集合 ,其中 .自编码神经网络是一种无监督学习算法,它使用了反向传播算法,并让目标值等于输入值,比如 .下图是一个自 ...

  9. 【字符编码】字符编码 && Base64编码算法

    一.前言 在前面的解决乱码的一文中,只找到了解决办法,但是没有为什么,说白了,就是对编码还是不是太熟悉,编码问题是一个很简单的问题,计算机从业人员应该也必须弄清楚,基于编码的应用有Base64加密算法 ...

随机推荐

  1. 【SQLite】select into 语句

    sqlite不支持类似sqlserver中的select into 语法 在SQL Server中,我们要将一个表中的数据复制到一个新表中,可以这样写: SELECT * INTO newtable ...

  2. vim之tags

    好长时间没有上来更新了, 今天趁老板不再上来休闲一下. 本章要说的是和vim的tags相关的内容. 之所以在跳转之后就说明tags是因为这个功能相当的重要和实用. 好的东西自然是需要提前分享的. 首先 ...

  3. postfix 邮件中继配置

    Postfix 配置邮件中继 A 邮件发送服务器B 邮件中继服务器 A. 配置发件服务器 # 开启转发规则 [root@Postfix ~]# vi /etc/postfix/main.cf tran ...

  4. java_randomAccessFile类的使用

    RandomAccessFile java提供的对文件内容的访问,既可以读文件,也可以写文件.RandomAccessFile支持随机访问文件,可以访问文件的任意位置 (1)java文件模型 在硬盘上 ...

  5. PHP 设计模式--序言

    面向对象是PHP5之后增加的功能,是PHP走向现代语言的一个标志. 在过程式设计时代,PHP以学习成本低.入门快的特点赢得很多WEB开发者的青睐,但同时也限制了PHP的发展. 借鉴Java和C++之后 ...

  6. Spring Boot 集成 JWT 实现单点登录授权

    使用步骤如下:1. 添加Gradle依赖: dependencies { implementation 'com.auth0:java-jwt:3.3.0' implementation('org.s ...

  7. js里的深度克隆

    ES6 数组克隆 let arr = [1,2,3,4,5]; let arr1 = [...a]; arr1 = ["a","b","c" ...

  8. How To : Modify ASM SYS password using asmcmd 11g R2 and upper

    修改RAC 11gR2及以上版本的ASM的SYS的密码方法 [grid]$ asmcmd ASMCMD> orapwusr --modify --password sys Enter passw ...

  9. 匈牙利算法求最大匹配(HDU-4185 Oil Skimming)

    如下图:要求最多可以凑成多少对对象 大佬博客: https://blog.csdn.net/cillyb/article/details/55511666 https://blog.csdn.net/ ...

  10. 17.使用原生cross-fiels技术解决搜索弊端

    主要知识点: 原生cross-fiels的用法 原生cross-fiels解决三个弊端     一.原生cross-fiels的用法     GET /forum/article/_search { ...