独特的2D阵列列排列

时间:2017-10-18 20:37:32

标签: arrays node.js algorithm

我有以下功能

function permutation(a){
    let res = [];
    for(let i=0; i<a.length; i++){
        let restA = a.slice(0,i).concat(a.slice(i+1));
        let rest = permutation(restA);
        if(rest.length === 0){
            res.push([a[i]]);
        }else{
            for(let j=0; j<rest.length; j++){
                res.push([a[i]].concat(rest[j]));
            }
        }
    }
    return res;
}

生成具有[1,2,3,4]等唯一值的1D数组的所有排列。

我还有一个二维数组填充零和这样的

[
    [1, 1, 1, 1, 1, 1, 1, 1],
    [0, 1, 1, 1, 1, 1, 1, 1],
    [0, 0, 1, 1, 1, 1, 1, 1],
    [0, 0, 0, 1, 1, 1, 1, 1],
    [0, 0, 0, 0, 1, 1, 1, 1],
    [0, 0, 0, 0, 0, 1, 1, 1],
    [0, 0, 0, 0, 0, 0, 1, 1],
    [0, 0, 0, 0, 0, 0, 0, 1]
]

我需要生成此数组的所有唯一排列。我该怎么做?

1 个答案:

答案 0 :(得分:0)

你可以忽略它是一个二维数组的事实,并认为它是34位值,34 1和30 0。通过这些位的每个有效组合,您可以构建一个独特的2D阵列(每行8位)。

但是,如果你进行数学计算,你会发现创建所有这些组合并不是真的可行:

64! / ( 34! * 30!) = 1.620288e+18

这几乎与无符号64位范围(1.8e+19)一样大 - 它几乎是其中的十分之一。

话虽如此,如果你真的想要这样做,只需迭代一个64位无符号整数,从0到MAXVALUE,并在每次迭代中测试“on”位数 - 如果它是34,你就找到了一个有效的组合