For example, if I wanted all binary strings of length 3 I could simply declare them like this:
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};
What is the most efficient way to generate all possibly binary strings of length N into a boolean array ?
I don't necessarily need the most efficient method, just one that's fairly efficient and easy for me to multithread.
EDIT: I should note that I will be storing them all in an ArrayList, if that matters.
Here's some code to generate a truth table... (works for only for 32 bits because of array size limits ( you can change the size variable to whatever and store booleans as 1/0 if you want):
int size = 3;
int numRows = (int)Math.pow(2, size);
boolean[][] bools = new boolean[numRows][size];
for(int i = 0;i<bools.length;i++)
{
for(int j = 0; j < bools[i].length; j++)
{
int val = bools.length * j + i;
int ret = (1 & (val >>> j));
bools[i][j] = ret != 0;
System.out.print(bools[i][j] + "\t");
}
System.out.println();
}
Example: If you need of length 4, then you must have 2^4 = 16 different arrays.
You can use this simple Java code to generate all arrays:
for (int i=0; i < (Math.pow(2,4)); i++) {
System.out.println(Integer.toBinaryString(i));
}
The output of this:
0 1 10 11 100 101 110 111 1000 1001 1010 1011 1100 1101 1110 1111
If you do not care about having all the permutations at once, a smart thing to do is to allocate no memory beforehand and simply write an algorithm which calculates the strX
you want, on-the-fly.
Advantages of doing this:
To get you started, the algorithm's interface can look something like this:
boolean[] getRow( int rowNumber, int nItems )
So you would call getRow(5,3)
to get str5
returned from the function. I leave it up to you to implement the details (it's not hard).
This is how I did it in 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);
}
}
}
Implemented it in a function-
static public ArrayList<boolean[]> getBoolArr(int length) {
int numOptions = 1 << length;
ArrayList<boolean[]> finalArray = new ArrayList<boolean[]>();
for(int o=0;o<numOptions;o++) {
boolean[] newArr = new boolean[length];
for(int l=0;l<length;l++) {
int val = ( 1<<l ) & o;
newArr[l] = val>0;
}
finalArray.add(newArr);
}
return finalArray;
}
example of usage-
ArrayList<boolean[]> res = getBoolArr(2); //2 is your length, change it however you want.
javascript
implementation relevant to duplicate Question https://stackoverflow.com/questions/42591231/calculate-all-possible-combinations-of-n-off-on-elements .
As with all numbers, there is a relationship between sets of numbers, where once the pattern is recognized, addition can be used to derive the relationships between sets of numbers at specific indexes within an array sets.
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);
This is how I implemented it in Scala
def combinations(n: Int): List[List[Int]] = {
val numbers = scala.math.pow(2, n).toInt
//Convert each to binary equivalent
def toBinary(decimal: Int, binary: List[Int]): List[Int] = {
if (decimal <= 0)
return le(binary)
toBinary(decimal / 2, (decimal % 2) :: binary)
}
// Size alignment
def le(binary: List[Int]):List[Int]=
{
if(binary.length!=n) le(0::binary) else binary
}
def getCombinations(n: Int, list: List[List[Int]]): List[List[Int]] = {
if (n < 0)
return list
getCombinations(n - 1, toBinary(n, Nil) :: list)
}
getCombinations(numbers - 1, Nil)
}
Sample output:
Thanks to my friend James A.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.