HashMap Java中布尔值的组合

时间:2018-05-09 06:02:55

标签: java algorithm iteration permutation

我有一个hashmap(Integer,Boolean),键从1 ... N开始。我试图创建一种经历每种布尔组合的暴力方法,最终复杂度为O(2 ^ N)。我使用键作为计算的变量,因此散列图中的布尔值变化至关重要,而不是转换为数组。

所以大小为4的散列图就是 1错 2错 3错 4错误

下一次迭代将是 1错 2错 3错 4真

下一次迭代将是 1错 2错 3对 4错误

依旧......

2 个答案:

答案 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表示MSB,n表示问题中提到的LSB。
  • 时间复杂度为O(n * 2 ^ n)。如果可以在带有地图的O(2 ^ n)中进行,请点击。

答案 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]