首页 > 解决方案 > 如何有效地相交两个 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 魔法可能会更有效。

标签: javabitmap

解决方案


推荐阅读