生成所有大小为n的二进制字符串到布尔数组的最快方法?

例如,如果我想要所有长度为3的二进制字符串,我可以简单地将它们声明为:

boolean[] str1 = {0,0,0}; boolean[] str2 = {0,0,1}; boolean[] str3 = {0,1,0}; boolean[] str4 = {0,1,1}; boolean[] str5 = {1,0,0}; boolean[] str6 = {1,0,1}; boolean[] str7 = {1,1,0}; boolean[] str8 = {1,1,1}; 

将所有可能的长度为N的二进制字符串生成到布尔数组中的最有效方法是什么?

我不一定需要最有效的方法,只需要一个相当高效且易于multithreading的方法。

编辑:我应该注意,如果重要的话,我将把它们全部存储在ArrayList中。

这里有一些生成真值表的代码…(由于数组大小的限制,只适用于32位(如果需要,可以将大小变量更改为任何值并将布尔值存储为1/0):

 int size = 3; int numRows = (int)Math.pow(2, size); boolean[][] bools = new boolean[numRows][size]; for(int i = 0;i>> j)); bools[i][j] = ret != 0; System.out.print(bools[i][j] + "\t"); } System.out.println(); } 

示例:如果需要长度为4,则必须具有2 ^ 4 = 16个不同的数组。

您可以使用这个简单的Java代码生成所有数组:

 for (int i=0; i < (Math.pow(2,4)); i++) { System.out.println(Integer.toBinaryString(i)); } 

这个输出:

0 1 10 11 100 101 110 111 1000 1001 1010 1011 1100 1101 1110 1111

如果你不关心同时拥有所有的排列,那么聪明的事情就是事先分配内存 ,只需编写一个算法,即可在strX计算出你想要的strX

这样做的好处:

  • 您可以处理任意大量的排列,而无需分配所有排列
  • 由于算法不存储任何内容,因此它是线程友好的
  • 您只需为所需的行付费。 例如,如果n = 1,000,但您只需要一些排列,这将更快,并且需要一小部分内存(只有一行值)

为了帮助您入门,算法的界面可能如下所示:

boolean [] getRow(int rowNumber,int nItems)

因此,您可以调用getRow(5,3)从函数返回str5 。 我把它留给你来实现细节(这并不难)。

在一个function中实现它 –

 static public ArrayList getBoolArr(int length) { int numOptions = 1 << length; ArrayList finalArray = new ArrayList(); for(int o=0;o0; } finalArray.add(newArr); } return finalArray; } 

使用范例 –

 ArrayList res = getBoolArr(2); //2 is your length, change it however you want. 

与重复相关的javascript实现问题https://stackoverflow.com/questions/42591231/calculate-all-possible-combinations-of-n-off-on-elements 。

与所有数字一样,数字集之间存在关系,一旦识别出模式,就可以使用加法来推导数组中特定索引处的数字集之间的关系。

 let [N, n1, n2, n3] = [0, 1, 9, 89]; let [res, max] = [Array(Array(3).fill(N)), Math.pow(2, 3)]; for (let i = 1, curr; i < max; i++) { if ([1, 3, 5, 7].some(n => n === i)) { N += n1; } if ([2, 6].some(n => n === i)) { N += n2; } if (i === max / 2) { N += n3; } curr = Array.from(String(N), n => +n); if (N < 100) { while (curr.length < 3) { curr.unshift(n1 - 1); } } res.push(curr); } console.log(res); 

这就是我用Java做的

 public class NbitsStrings { int[] arrA; public static void main(String[] args) throws java.lang.Exception { Scanner input = new Scanner(System.in); //Input the Number Of bits you want. int n = input.nextInt(); NbitsStrings i = new NbitsStrings(n); i.nBits(n); } public NbitsStrings(int n) { arrA = new int[n]; } public void nBits(int n) { if (n <= 0) { StringBuilder builder = new StringBuilder(); for (int value : arrA) { builder.append(value); } String text = builder.toString(); System.out.println(text); } else { arrA[n - 1] = 0; nBits(n - 1); arrA[n - 1] = 1; nBits(n - 1); } } }