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 |