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;
}
分享到:
相关推荐
Lucene 是一个强大的全文搜索引擎库,它允许开发者创建高效的索引和检索机制。在构建实时索引时,尤其是在处理文档的更新和删除时,需要理解Lucene提供的不同方法以及它们的适用场景。以下是对Lucene删除文档和更新...
我们可以使用OpenBitSet来缓存删除的文档,然后在FilterIndexReader中对其进行过滤。 索引更新是Lucene中的一种重要机制,用于实时更新索引中的文档。我们需要根据实际情况选择合适的删除方式,并使用...
源头 - 分布式位图索引原语 注意:该项目目前作为概念证明存在。 虽然我信任索引器,但仍有大量性能和... 我已经从非常出色的OpenBitSet (从 Lucene 复制)和一个包装了byte[]数组的简单位图构建了参考位图。源头哈
【岗位说明】酒店各个岗位职责
机械设计注塑件水口冲切码盘设备_step非常好的设计图纸100%好用.zip
【岗位说明】公司各部门组织架构和岗位职责
使用YOLOv5和LPRNet进行车牌检测+识别(CCPD数据集)车牌识别项目(CCPD数据集)这个项目是利用YOLOv5和LPRNet对CCPD车牌进行检测和识别。之前一直在学习OCR相关的东西,就想着能不能做一个车牌识别的项目出来,之前也准备好车牌识别。我的打算是做一个轻量级的车牌识别项目,用YOLOv5进行车牌检测,用LPRNet进行车牌识别。目前仅支持识别蓝牌和绿牌(新能源车牌)等中国车牌。后续如果添加数据,可以再继续改装,可支持更多场景和更多类型车牌,提高识别准确率!主要参考以下四个仓库Githubhttps://github.com/ultralytics/yolov5Githubhttps ://github.com/sirius-ai/LPRNet_Pytorchhttps://gitee.com/reason1251326862/plate_classificationhttps://github.com/kiloGrand/License-Plate-Recognition如果对YOLOv5不熟悉源码的同学可以先看看我写的YOLOv5讲解
基于.net的医院信息管理系统(C#)。资源来源于网络分享,如有侵权请告知!
【岗位说明】营销中心高级经理岗位职责
环戊二烯行业分析:2024年全球环戊二烯市场销售额达到了8.83亿美元 环戊二烯,这一独特的化学品,在聚合物、制药、弹性体等多个领域展现出了广泛的应用前景。随着全球经济的持续增长和技术的不断进步,环戊二烯市场需求不断攀升。然而,面对复杂多变的市场环境和日益激烈的竞争,如何准确把握市场脉搏,制定有效的市场策略成为企业面临的关键问题。本文将带您深入了解全球环戊二烯市场的现状、趋势及机遇,为您的成功之路提供有力支持。 市场概况: 根据QYR(恒州博智)的统计及预测,2024年全球环戊二烯市场销售额达到了8.83亿美元,这一数字不仅彰显了市场的庞大规模,更预示着其强劲的增长势头。预计至2031年,市场规模将进一步扩大至12.25亿美元,年复合增长率(CAGR)高达4.8%。亚洲作为最大的市场,占有约45%的份额,展现出强劲的区域增长潜力。 技术创新与趋势: 技术创新是推动环戊二烯市场发展的核心动力。随着环保意识的提高和可持续发展理念的深入人心,市场对环保型环戊二烯产品的需求日益增长。同时,新型催化剂和合成技术的研发,为环戊二烯的生产和应用带来了更多可能性。 应用领域与细分市场: 环戊二烯在树脂
配电柜光按钮检测图像数据集,数据集总共700张左右图片,标注为VOC格式。内容来源于网络分享,如有侵权请联系我删除。另外如果没有积分的同学需要下载,请私信我。
【岗位说明】销售人员岗位职责说明书
【岗位说明】市场与销售类岗位说明书
【岗位说明】销售部各职务详细岗位说明书描述
c语言运行程序
multisim声控流水灯仿真电路设计 功能: 制作一个声控的LED流水灯电路,20只灯珠依次点亮,当 音量高时流水灯切快,当音调低时流水灯切慢。 1.制作拾音整形电路; 2.制作LED驱动电路; 3.制作系统所需的直流电源; 资料包含:仿真源文件+原理说明书(仅参考)+演示视频
基于Python的南京二手房数据采集及可视化分析1 内容简介首先通过爬虫采集链家网上所有南京二手房的房源数据,对文献采集到的数据进行清理然后,对清理后的数据进行可视化背后的分析,探索隐藏在大量数据的规律最后,采用一个全新的对所有二手房数据进行算法分析,并根据奥迪分析的结果,将这些房源大致分类,以对所有数据的百年总结。通过上述分析,我们可以了解目前二手房各项基本情况特征及房源分配情况,帮助我们进行购房决策。2 应用技术介绍1)Python网络爬虫技术请求美丽的汤2)Python分析技术NumpyMatplotlib熊猫3)k-means聚类算法4)高德地图开发者应用JS API3 数据采集及数据清洗3.1 数据采集该部分通过网络爬虫程序抓取网上所有南京二手房的数据,收集原始数据,作为整个数据分析的基石。3.1.1链家网网站结构分析链家网二手房主页界面如图1、图2,主页上面红色方塔位置显示了目前南京房在售房源的各区域位置名称,中间红色方塔位置显示了房源的总数量,下面红色方方框显示了二手房源信息,该红色方框区域包含了二手房源页面的UR
西门子变频器 SINAMICS STARTER V5.6 HF1 软件 STARTER V56 STARTERV56HF1 ISO 001
激光熔覆仿真comsol通过激光进行熔覆工艺进行仿真,对温度与应力进行研究 采用COMSOL中的固体传热等物理场进行耦合仿真 对激光熔覆工艺完成后的温度分布与应力分布以云图形式输出,并研究某一点温度与应力随时间变化的曲线关系,温度梯度随时间变化的曲线关系,第三主应力随时间变化的曲线关系。 以及整个激光熔覆工艺过程的动画。
RoboMaster 智能数据集标注工具RoboMaster 智能数据集标注工具基于[ Qt5+OpenCV(with OpenVINO) ],用于标注RoboMaster装甲板4个顶点的位置,灯条颜色,以及贴纸类型。开发中分支,建议下载release里的软件和源码本人的第一个Qt项目,写的不好的地方见谅项目介绍基于深度学习的自瞄准识别算法逐渐走进RoboMaster的赛场。相比于传统的视觉识别算法,基于深度学习的算法具有更强的鲁棒性和识别性,受到增强队伍的青睐。然而常规深度学习的目标检测算法只能识别出目标的映射,这给后续算法中的单目测距带来了困难。本项目希望能够建立一个方便的4点数据集标注工具,可以快速而准确的完成数据集的制作。主要功能亮点将标准装甲板贴纸图像添加到图片上,包括观察的一些结果。选点时局部放大,然后观察选点位置。智能预识别,弱人力。(需要带 OpenVINO 支持的 OpenCV,可以不用OpenVINO,但速度会变慢)图像的缩放与拖动。使用OpenVINO进行int8加速。(无OpenVINO时无法使用)一键自动标定所有图