创建位矩阵和扫描集列的有效方法

时间:2013-05-12 12:28:31

标签: java matrix bloom-filter

这是我目前的问题,我有一些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的所有列?

是否有任何数据结构可以帮助我解决这个问题?

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)的运行时间为nnbits的总数,这是非常好的。

但除非你非常不走运,否则你会因为短路逻辑而获得更好的运行时间。

以上适用于位数组,但BitSets具有一些有用的功能。

BitSet包含函数:length(),它返回最高索引,设置位+ 1(如果没有设置位,则返回0)和nextSetBit(index)返回index -> end包含的下一个设置位的索引。

所以你的代码很容易就像:

int index = 0;

while (index < BitSet.length()) {
    index = BitSet.nextSetBit(index);
    list.append(index);
    index++;
}