所有可能的零和一组合

时间:2018-01-06 00:13:10

标签: javascript arrays

我有一个由零和一组组成的数组。例如,arr = [0,0,1,1,1]如何对所有可能的组合进行排序,其中1和0的数量保持不变(根据示例,零的数量为2,1的数量为3)?总共有C(5,3)C(5,2),其中C = n! / ((n-k)! * k!))

我知道如何在数组中获得1和0的所有可能组合,其中有2 ^ n个部分。有代码:

var color = [];
for(var i = 0; i < n;i++) color[i] = 0; 
do{ 
    color[0] += 1;
    for(var i = 0; i < n-1;i++){
        if(color[i] == 2) color[i] = 0, color[i+1] += 1;
            else break;
    }
    if(color[n-1] == 2) break;        
}

while(..);

1 个答案:

答案 0 :(得分:0)

计算设置的位有点棘手,但有些算法可以做到。这是我从this answer偷走的一个。

function countSetBits(i)
{
    i = i - ((i >> 1) & 0x55555555);
    i = (i & 0x33333333) + ((i >> 2) & 0x33333333);
    return (((i + (i >> 4)) & 0x0F0F0F0F) * 0x01010101) >> 24;
}

如果我们知道设置了多少位,我们可以推断其余位未设置。然后我们可以循环遍历适当范围内的所有整数(范围始终从0开始并上升到2 ^ (total bits) - 1)以找到正确的数字,其函数如下:

function generateNumbers(set, clear)
{
    for ( var n = 0; n < Math.pow(2, set + clear); n++)
    {
        if (countSetBits(n) == set)
        output(n);
    }
}

这是一个完整的解决方案:

function countSetBits(i)
{
     i = i - ((i >> 1) & 0x55555555);
     i = (i & 0x33333333) + ((i >> 2) & 0x33333333);
     return (((i + (i >> 4)) & 0x0F0F0F0F) * 0x01010101) >> 24;
}

function output(i)
{
    document.getElementById("Data").innerText += i + "\r\n";
}

function generateNumbers(set, clear)
{
    for ( var n = 0; n < Math.pow(2, set + clear); n++)
    {
        if (countSetBits(n) == set)
        output(n);
    }
}

generateNumbers(2,3);

输出:

3
5
6
9
10
12
17
18
20
24

以上每个都有2位设置为1,3位设置为0

查看并运行JSFiddle上的代码。