我正在寻找一个快速算法,它给出了BitSet对象中设置位的所有索引.这很慢:
BitSet bitSet = ...
Collection<Integer> indexes = new ArrayList<Integer>(bitSet.cardinality());
int nextSetBit = bitSet.nextSetBit(0);
for (int i = 0; i < bitSet.cardinality(); ++i ) {
indexes.add(nextSetBit);
nextSetBit = bitSet.nextSetBit(nextSetBit + 1);
}
...
Run Code Online (Sandbox Code Playgroud)
任何帮助表示赞赏!
Lou*_*man 15
bitSet.cardinality()根本不需要使用:
for (int i = bitSet.nextSetBit(0); i != -1; i = bitSet.nextSetBit(i + 1)) {
indexes.add(i);
}
Run Code Online (Sandbox Code Playgroud)
在BitSet#nextSetBit(int) javadocs中指定:
//To iterate over the true bits in a BitSet, use the following loop:
for (int i = bs.nextSetBit(0); i >= 0; i = bs.nextSetBit(i+1)) {
// operate on index i here
if (i == Integer.MAX_VALUE) {
break; // or (i+1) would overflow
}
}
Run Code Online (Sandbox Code Playgroud)
Dur*_*dal -1
更改循环(将复杂性增加到 O(N^2),因为在每次循环迭代中调用 cardinality()):
for (int e = bitSet.cardinality(), i = 0; i < e; ++i ) {
indexes.add(nextSetBit);
nextSetBit = bitSet.nextSetBit(nextSetBit + 1);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8187 次 |
| 最近记录: |