有效地生成2 ^ n个组合(/ w java)

时间:2017-04-15 13:32:31

标签: java optimization binary

我正在尝试尽可能高效地生成所有2 ^ n(并将它们保存到数组中),就像     0001     0010     0011     等等 其中n可以达到15。

这是我的代码:

public static void main(String args[]) {
    final long startTime = System.nanoTime();
    final int N = 15;
    int m = (int) Math.pow(2, N) - 1;
    int[][] array = new int[m][N];
    int arrLength = array.length;

    for (int i = 0; i < arrLength; i++) {
        String str = String.format("%" + N + "s", Integer.toBinaryString(i + 1)).replace(' ', '0');
        for (int j = 0; j < N; j++) {
            array[i][j] = Character.getNumericValue(str.charAt(j));
        }
    }
    final long duration = System.nanoTime() - startTime;
    double sec = (double) duration / 1000000000.0;
    System.out.println(sec);
}

关于我如何更快地做到这一点的任何建议? 截至目前,我的计时器表示它需要~0.1至~0.12

2 个答案:

答案 0 :(得分:2)

字符串处理往往很慢(通常需要循环和分配)。您可以将有趣的位移到位置0,然后使用按位和1来切断更高的位。

for (int i = 0; i < arrLength; i++) {
    for (int j = 0; j < N; j++) {
        array[i][j] = (i >> j) & 1;
    }
}

P.S。我遗漏了向i添加1,不确定这是否是原始代码中的意图,应该根据需要直接添加。

答案 1 :(得分:2)

我最有效的方法是根本不生成它们,大致需要...... 0纳秒。

这些字符串是从0到2 ^ n-1的所有整数的文本表示,枚举并不神秘。不需要存储它们(在数组中),因为键与索引相同。

如果您有令人信服的理由将它们作为字符串处理,您可以在需要时使用自己的例程或使用toBinaryString执行转换。

根据您的申请,f.i。字符串查找,另一个选项可以是将给定的字符串转换为整数值。如果目标是检查给定组合中物品的存在/不存在,二元掩模将起到有效作用。