我有一个hashmap(Integer,Boolean),键从1 ... N开始。我试图创建一种经历每种布尔组合的暴力方法,最终复杂度为O(2 ^ N)。我使用键作为计算的变量,因此散列图中的布尔值变化至关重要,而不是转换为数组。
所以大小为4的散列图就是 1错 2错 3错 4错误
下一次迭代将是 1错 2错 3错 4真
下一次迭代将是 1错 2错 3对 4错误
依旧......
答案 0 :(得分:0)
您可以通过以下代码实现该功能。
public static void main(String[] args) {
List<Map<Integer, Boolean>> bitmapList = generateBitMaps(3);
for (Map<Integer, Boolean> bitmap : bitmapList) {
System.out.println(bitmap);
}
}
public static List<Map<Integer, Boolean>> generateBitMaps(int nBits) {
int size = (int) Math.pow(2, nBits);
List<Map<Integer, Boolean>> bitmapList = new ArrayList<>(size);
for (int i = 0; i < size; i++) {
Map<Integer, Boolean> bitmap = new HashMap<>(nBits);
int mask = size >> 1;
int bitId= 1;
while (mask > 0) {
if ((mask & i) == 0) {
bitmap.put(bitId, false);
} else {
bitmap.put(bitId, true);
}
mask = mask >> 1;
++bitId;
}
bitmapList.add(i, bitmap);
}
return bitmapList;
}
注意事项:
答案 1 :(得分:0)
看起来你想要强制来自1...N
的所有数字并检查它们的二进制表示。为什么需要保留位?只要有一个整数就足够了,你总能将它转换成一个布尔数组。
public class BitPlay {
public static void main(String[] args) {
for (Integer i = 0; i < 4; i++) {
System.out.println(Arrays.toString(toBinary(i, 2)));
}
}
private static boolean[] toBinary(int number, int base) {
final boolean[] ret = new boolean[base];
for (int i = 0; i < base; i++) {
ret[base - 1 - i] = (1 << i & number) != 0;
}
return ret;
}
}
产地:
[false, false]
[false, true]
[true, false]
[true, true]