#java #bitmap
Вопрос:
Каков наилучший с точки зрения производительности способ вычисления растрового изображения совпадающих позиций из двух растровых изображений?! Давайте приведем пример:
First bitmap contains: [1, 2, 3, 4, 5, 6, 7, 8, 9]
Second bitmap contains: [ 3, 4, 7, 9]
Результат, которого я хочу достичь, заключается в выполнении И операции над этими двумя растровыми изображениями, но вместо вывода И мне нужен набор позиций в первом растровом изображении, которые соответствуют значениям во втором растровом изображении. Таким образом, желаемый результат в нашем примере таков:
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 это может быть намного эффективнее.