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. java攻城狮之路--复习xml&dom_pull编程

    xml&dom_pull编程: 1.去掉欢迎弹窗界面:在window项的preferences选项中输入“configuration center” 找到这一项然后     把复选框勾去即可. ...

  2. Zynq7000系列之芯片系统结构概述

    相比较经典的FPGA,Zynq7000系列最大的特点是将处理系统PS和可编程资源PL分离开来,固化了PS系统的存在,实现了真正意义上的SOC(System On Chip). 1.  Zynq7000 ...

  3. What is gradle sync in Android Studio?

    What is it? And what does it do? Gradle sync is a gradle task that looks through all of your depende ...

  4. 微信小程序video监测播放进度

    video组件提供的进度相关的监测只有 bindtimeupdate ,官方说明这个函数250ms触发一次,在开发者工具上基本符合,但在真机上每隔1秒触发一次.达不到我们要求的精度.对比下音频,wx. ...

  5. CAD在网页中得到批注信息

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 3 ...

  6. demo_static_resrouce

    环境 win10 + webstorm 2019.1.3 + node 12.x + yarn 实现的的功能 基本的js打包(支持规范:ES6 module | requirejs | commonj ...

  7. springboot 使用idea打包 遇到问题

    找了很久错误后来发现添加这三句话就可以了 需要在项目的pom.xml文件中加上第47-49行的3句话

  8. 第一节:初识pandas之Series(上)

    Series线性的数据结构, 也是一个一维数组. 声明:本人Python小白,以下代码只是个人学习的过程,仅仅记录一下学习的点点滴滴,若有错误,还望指正. (注:该代码均在jupyter notebo ...

  9. Django——11 状态保持 form表单 登陆注册样例

    Django 状态保持 用户状态例子 实现注册登陆实例 django forms 表单的使用 注册功能 登陆功能   状态保持cookie和session 1.http协议是无状态的:每次请求都是一次 ...

  10. 【codeforces 797C】Minimal string

    [题目链接]:http://codeforces.com/contest/797/problem/C [题意] 一开始,给你一个字符串s:两个空字符串t和u; 你有两种合法操作; 1.将s的开头字符加 ...