`
chengqianl
  • 浏览: 51818 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

OpenBitSet和OpenBitSetIterator

阅读更多
OpenBitSet和OpenBitSetIterator

算法的思想是用一个long的数组的index和这个这个数组的某个值的某一位表示一个数,如果是一个long数组,如果不存在重复的情况下,最大可达到64倍的压缩,
算法的实现过程以long OpenBitSet这个类实现的一个上面提到的记录数据的数组

public OpenBitSet(long numBits) {
    bits = new long[bits2words(numBits)];  //根据指定的长度创建数组
    wlen = bits.length;  //记录数组的长度
  }


//计算数组的长度,给定一个长度,创建一个数组,长度除以64,通过移位来实现除法的
  public static int bits2words(long numBits) {
   return (int)(((numBits-1)>>>6)+1);
  }


设置值的过程,首先查看数组的大小是否满足,如果满足设置对应的值,对应的值的设置过程是,先计算该数字在数组里面的位置为a,然后计算这个位置的值。
位置的是通过expandingWordNum方法得到的
值的设置的原理是:先计算该数字的后6位的值是多少为b,然后就设置该数组的第a个数的第b位的值为1
/** sets a bit, expanding the set size if necessary */
  public void set(long index) {
    int wordNum = expandingWordNum(index);
    int bit = (int)index & 0x3f;
    long bitmask = 1L << bit;
    bits[wordNum] |= bitmask;
  }

计算该数所在数组的位置,如果超过数组的长度,则通过ensureCapacity扩大数组的长度
protected int expandingWordNum(long index) {
    int wordNum = (int)(index >> 6);
    if (wordNum>=wlen) {
      ensureCapacity(index+1);
      wlen = wordNum+1;
    }
    return wordNum;
  }

数组的长度的算法是在org.apache.lucene.util. ArrayUtil 里面实现的

public static int getNextSize(int targetSize) {
    /* This over-allocates proportional to the list size, making room
     * for additional growth.  The over-allocation is mild, but is
     * enough to give linear-time amortized behavior over a long
     * sequence of appends() in the presence of a poorly-performing
     * system realloc().
     * The growth pattern is:  0, 4, 8, 16, 25, 35, 46, 58, 72, 88, ...
     */
    return (targetSize >> 3) + (targetSize < 9 ? 3 : 6) + targetSize;
  }


还原的算法通过OpenBitSetIterator 实现的  构造方法如下,这个对象里面有二个属性,一个是保存long[] bits 的数组一个用来记录长度。

private final long[] arr;

private final int words;

public OpenBitSetIterator(OpenBitSet obs) {
    this(obs.getBits(), obs.getNumWords());
  }

public OpenBitSetIterator(long[] bits, int numWords) {
    arr = bits;
    words = numWords;
  }

还原的算法:遍历这个数组,取出每个值,由这个值的每个bit的值和这个值的index还原存储的long的值。
计算的过程实际上通过以为的wordShift 加上最后一个byte的每一个位的位置的值。每个byte置的每个位的位置的值是通过一个int的数据表示的,因为一个byte中的bit的位置最多是8 ,所以可以用一个4个的bit表示8。那一个int 就可以表示8个位置。
public int nextDoc() {
    if (indexArray == 0) {  // indexArray 是一个int形的数据用他的四个bit 就是存储位置信息
      if (word != 0) {
        word >>>= 8;
        wordShift += 8;
      }

      while (word == 0) {如果
        if (++i >= words) {
          return curDocId = NO_MORE_DOCS;
        }
        word = arr[i];
        wordShift = -1; // loop invariant code motion should move this
      }

      // after the first time, should I go with a linear search, or
      // stick with the binary search in shift?
      shift();
    }

    int bitIndex = (indexArray & 0x0f) + wordShift;
    indexArray >>>= 4;
    // should i<<6 be cached as a separate variable?
    // it would only save one cycle in the best circumstances.
    return curDocId = (i<<6) + bitIndex;
  }
分享到:
评论

相关推荐

    headwater:位图索引原语

    源头 - 分布式位图索引原语 注意:该项目目前作为概念证明存在。 虽然我信任索引器,但仍有大量性能和... 我已经从非常出色的OpenBitSet (从 Lucene 复制)和一个包装了byte[]数组的简单位图构建了参考位图。源头哈

    tensorflow-2.9.2-cp39-cp39-win-amd64.whl

    python爬虫案例

    2023年下半年计算机等级考试-公共基础-WPS-PS.zip

    2023年下半年计算机等级一级考试Photoshop考点梳理 2023年下半年计算机等级一级考试WPS office考点汇总 2023年下半年计算机二级考试公共基础知识科目考点汇总 根据实际考试情况进行的总结。

    Introduction to Data Science Data With R 英文

    Introduction to Data Science Data Analysis and Prediction Algorithms with R 英文原版,完整带目录,非常好的数据分析资料,有基于R的完整数据分析过程

    数电实验三:74LS151逻辑功能测试、74LS153逻辑功能测试、74LS153全加器、三输入多数表决电路

    数电实验三:74LS151逻辑功能测试、74LS153逻辑功能测试、74LS153全加器、三输入多数表决电路

    农业机械维修记录(表式).doc

    农业机械维修记录(表式).doc

    go语言优质学习资源和工具与案列应用场景.txt

    go语言优质学习资源和工具与案列应用场景.txt

    网络攻防课程seed-labs实验-Spectre_Attack.zip

    网络攻防课程seed-labs实验-Spectre_Attack.zip

    GameAssistant_300200000_0_ 2.exe

    GameAssistant_300200000_0_ 2.exe

    电商小程序前端模板下载

    电商小程序前端模板下载。

    MySQL开发案列优质学习资料资源工具与案列应用场景开发文档教程资料.txt

    MySQL开发案列优质学习资料资源工具与案列应用场景开发文档教程资料.txt

    基于图像处理技术的蛋鸡采食行为研究源码.zip

    提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

    2024海外营销日历.zip

    2024海外营销日历.zip

    最新版点微同城源码34.7+全套插件+小程序前后端附图片

    最新版点微同城源码34.7+全套插件+小程序前后端附图片 模板挺好看的 带全套插件 自己耐心点配置一下插件 可以H5可以小程序

    二开微信表情包小程序+前后端

    最新二开微信表情包小程序+前后端 【去授权版】,带简单文本教程,已经去除授权加二开 内含二开版本和表情包-黄色版本

    Python爬取百度贴吧数据.zip

    python爬虫案例

    端午节相关庆祝代码的示例

    端午节相关庆祝代码的示例

    开源光谱分析仪博客的代码

    开源光谱分析仪项目的代码,作出了一些改进: 1.添加了详细的中文注释; 2.把图片中的英文图例说明改成了中文图例,图例字体设置为宋体;

    基于校园一卡通的学生考勤信息分析展示系统设计与实现源码.zip

    提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

    JSP基于BS结构下的邮件系统设计开发(源代码+lw).zip

    随着网络的逐渐普及,Email在人们生活中应用日益广范,除了专业的邮件服务系统之外,一般大型网站与单位都提供了email服务。因此,本次设计是通过对SMTP、pop3协议的熟悉和理解、以及对JSP编程和网页设计技能的掌握,开发出一个简单的B/S结构下的邮件服务系统。能完成邮件的发送、接收、以及附件处理功能等。主要运用的软件有Eclipse, SQL Server,在JAVA环境下,利用JSP编程来实现邮件系统的各种功能。该系统主要支持用户的身份验证,用户只有通过正确注册后才能进入该系统。在系统中可以查看自己的邮件也可以发送邮件到任意的邮箱,发邮件的时候可以进行附件的发送。通过本次课题的学习和研究掌握了基本的web编程技能,更实践了自我的动手能力。同时认识到在信息化高速发展的今天,高效、快速、方便的邮件收发系统将得到越来越多的人关注和使用,它将给人们带来更方便快捷的生活。

Global site tag (gtag.js) - Google Analytics