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

时间:2011-12-04 08:07:54

标签: java binary boolean

例如,如果我想要所有长度为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的二进制字符串生成为布尔数组的最有效方法是什么?

我不一定需要 最有效的方法,只需要一个对我来说非常有效且容易多线程的方法。

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

7 个答案:

答案 0 :(得分:6)

这里有一些生成真值表的代码...(因为数组大小限制只适用于32位(你可以将size变量更改为任何值,如果你愿意,可以将布尔值保存为1/0):

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();
    }

答案 1 :(得分:4)

示例:如果需要长度为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

答案 2 :(得分:3)

如果您不关心同时拥有所有排列,那么明智的做法是事先不分配内存,只需编写计算 {的算法{1}}你想要,即时。

这样做的好处:

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

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

  

boolean [] getRow(int rowNumber,int nItems)

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

答案 3 :(得分:1)

在函数中实现它 -

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;
    }

使用示例 -

ArrayList<boolean[]> res = getBoolArr(2); //2 is your length, change it however you want.

答案 4 :(得分:1)

这就是我在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);
        }
    }
}

答案 5 :(得分:0)

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

javascript实施。

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

&#13;
&#13;
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);
&#13;
&#13;
&#13;

答案 6 :(得分:0)

这就是我在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)
}

示例输出:

  • combinations(2)//列表(列表(0,0),列表(0,1),列表(1,0),列表(1,1))
  • combinations(3)//列表(列表(0,0,0),列表(0,0,1),列表(0,1,0),列表(0,1,1),列表(1 ,0、0),列表(1、0、1),列表(1、1、0),列表(1、1、1))

感谢我的朋友James A。