zoukankan      html  css  js  c++  java
  • 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

    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 Sizeratio%Bits/IntegerC MI/sD MI/sName
    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
     
     
  • 相关阅读:
    洛谷 P1383 高级打字机==codevs 3333 高级打字机
    洛谷 P1525 关押罪犯==codevs 1069 关押罪犯[NOIP 2010]
    洛谷P2668 斗地主==codevs 4610 斗地主[NOIP 2015 day1 T3]
    poj1426
    3049 舞蹈家怀特先生
    1444 “破锣摇滚”乐队
    cocos2d-x开发的《派对小游戏》-github源代码分享
    【c语言】字符串替换空格:请实现一个函数,把字符串中的每一个空格替换成“%20”
    CAP理论与HBase
    也谈以人为本—— 服务型企业的管理随想
  • 原文地址:https://www.cnblogs.com/bonelee/p/6888878.html
Copyright © 2011-2022 走看看