我正在尝试尽可能高效地生成所有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
答案 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。字符串查找,另一个选项可以是将给定的字符串转换为整数值。如果目标是检查给定组合中物品的存在/不存在,二元掩模将起到有效作用。