这是我目前的问题,我有一些Bloom过滤器,我想把它构建成一个矩阵,比如说:
[0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1]
[1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0]
...
[1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0]
每个列都将从BitSet派生,除了循环所有行并比较每个索引之外,是否有更有效的方法来查找位设置为1的所有列?
是否有任何数据结构可以帮助我解决这个问题?
答案 0 :(得分:2)
假设您正在寻找哪些列包含列,而现在每列包含多少,那么循环显示它们似乎是最好的主意。
如果使用一些短路逻辑实现循环,那么您将获得更好的平均运行时间。
类似的东西:
for (int column = 0; column < width; column++) {
for (int row = 0; row < height; row++) {
if (array[column][row] == 1) {
list.append(column);
break; // move on to the next column because we don't care what's
// left in this column as we already found our '1'
使用此代码,您将获得最坏情况(如果每个bit
0
)的运行时间为n
(n
是bits
的总数,这是非常好的。
但除非你非常不走运,否则你会因为短路逻辑而获得更好的运行时间。
以上适用于位数组,但BitSets
具有一些有用的功能。
BitSet
包含函数:length()
,它返回最高索引,设置位+ 1(如果没有设置位,则返回0
)和nextSetBit(index)
返回index -> end
包含的下一个设置位的索引。
所以你的代码很容易就像:
int index = 0;
while (index < BitSet.length()) {
index = BitSet.nextSetBit(index);
list.append(index);
index++;
}