java - 如何有效地相交两个 RoaringBitmap 并获得匹配位置的 RoaringBitmap
问题描述
从两个 RoaringBitmaps 计算匹配位置的位图的最佳性能方法是什么?!让我们举个例子:
First bitmap contains: [1, 2, 3, 4, 5, 6, 7, 8, 9]
Second bitmap contains: [ 3, 4, 7, 9]
我想要实现的结果是对这两个位图执行 AND 操作,但不是 AND 输出,我需要第一个位图中与第二个位图中的值匹配的位置集。因此,我们示例中想要的结果是:
Wanted result: [ 2, 3, 6, 8]
位图 2 始终是位图 1 的子集(即位图 2 中的每个数字也存在于位图 1 中)。
我目前的实现是:
final RoaringBitmap bitmap1 = ...;
final RoaringBitmap bitmap2 = ...;
final RoaringBitmapWriter<RoaringBitmap> resultWriter = RoaringBitmapWriter.writer().constantMemory().runCompress(false).get();
final IntIterator allIt = bitmap1.getBatchIterator().asIntIterator(new int[8192]);
bitmap2.forEach(new IntConsumer() {
private int position = -1;
@Override
public void accept(int filteredId) {
while (allIt.hasNext()) {
++position;
final int allId = allIt.next();
if (filteredId == allId) {
resultWriter.add(++position);
break;
}
}
}
});
final int[] result = resultWriter.get().toArray();
但它由使用迭代器/批处理迭代器的两次完整扫描组成,我觉得使用一些 RoaringBitmap 魔法可能会更有效。
解决方案
推荐阅读
- vue.js - framework7 vue简单项目中路由'/'的参考索引/home/主视图
- php - 如何将来自查询 sql 结果的相等信息分组到 php
- android-spinner - 在低于或等于 23 的 android 版本中,微调器中的选定项目为白色
- sql - 在sql中计算总数
- python - 如何使用 lxml 从 xml 中提取数据?
- javascript - 在 Javascript 中单行定义数组
- hyperledger-fabric - 在结构部署中,域地址比对等设置中的ip地址有什么优势
- javascript - `Object.create(ctor.prototype)` 和 `new ctor()` 之间的区别
- nginx - 在 istio 入口网关中启用端口
- mysql - 在两个远程服务器之间传输数据。从 sql server 到 mysql