2017-10-18 113 views
0

我有以下功能独特的2D阵列列排列

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]唯一值。

我也有充满零和一这样

[ 
    [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] 
] 

我需要生成该阵列的所有独特排列二维数组。我该怎么做呢?

回答

0

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

但是,如果你做数学题,你会看到它不是真正可行的创建所有这些组合:

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

这几乎是无符号的64位范围(1.8e+19)大 - 它实际上那是十分之一。


说了这么多,如果你真的想这样做,只是从0迭代64位无符号整数高达MAXVALUE和测试“开”位数,每次迭代 - 如果是34,你找到了有效的组合。