<分区>
尽管阅读了很多关于排列/组合的问答:Finding All Combinations of JavaScript array values + JavaScript - Generating combinations from n arrays with m elements,但我还没有找到获得所需结果的正确方法。 我有一个 10 值数组:
var arr = [0,1,2,3,4,5,6,7,8,9];
如果我是对的,所有可能的唯一值置换数组的数量(无重复):
[5,9,1,8,2,6,7,0,4,3] [4,8,0,2,1,9,7,3,6,5] ...
是 2x3x4x5x6x7x8x9x10 = 3628800
我正在尝试生成一个动态创建“n”数组的函数。例如:
function createArray(0) -> [0,1,2,3,4,5,6,7,8,9]
function createArray(45648) -> [0,1,5,3,2,8,7,9,6] (something like...)
function createArray(3628800) -> [9,8,7,6,5,4,3,2,1,0]
我想实现它的方式是:
createArray(1) 排列最后 2 个符号 (8,9 -> 9,8)
createArray(2->6) 排列最后 3 个符号 (8,7,9 -> 9,8,7)
createArray(3628800) :所有值都被排列 (9->0)
您认为这可能/容易做到吗?如果是,如何进行?
[编辑]
感谢您的帮助
function permute(permutation, val) {
var length = permutation.length,
result = [permutation.slice()],
c = new Array(length).fill(0),
i = 1, k, p,
n = 0;
while (i < length) {
if (c[i] < i) {
if (n <= val) {
k = i % 2 && c[i];
p = permutation[i];
permutation[i] = permutation[k];
permutation[k] = p;
++c[i];
i = 1;
if (n == val) {
arr = permutation.slice();
console.log("n="+n+"\n"+arr);
console.log( 'Duration: '+((new Date() - t1)/1000)+'s' );
break;
}
else { n+=1; }
}
} else {
c[i] = 0;
++i;
}
}
}
let t1 = new Date();
permute([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 100000); // <- array requested
控制台:n=100000 + 0,5,8,1,7,2,3,6,4,9 + 持续时间:0.004s