生成所有大小为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); } } }