Wol*_*den 5 javascript arrays combinations permutation
尽管阅读了很多关于排列/组合的Q/A:查找JavaScript数组值的所有组合 + JavaScript - 从具有m个元素的n个数组生成组合我还没有找到正确的方法来获得我正在寻找的那种结果.我有一个10值数组:
var arr = [0,1,2,3,4,5,6,7,8,9];
Run Code Online (Sandbox Code Playgroud)
如果我是对的,所有可能的唯一值的置换数组(没有重复)的数量:
[5,9,1,8,2,6,7,0,4,3] [4,8,0,2,1,9,7,3,6,5] ...
Run Code Online (Sandbox Code Playgroud)
是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]
Run Code Online (Sandbox Code Playgroud)
我想要实现它的方式是:
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
Run Code Online (Sandbox Code Playgroud)
控制台:n = 100000 + 0,5,8,1,7,2,3,6,4,9 +持续时间:0.004s
由于这个问题没有描述一个特定的编程问题,而是一个任务,而且这是一个相当复杂的问题,所以你不应该期望有一个完整的解决方案作为答案,但我将尝试描述一种可能的方法:
正如你所说,排列的数量是2x3x4x......
您可以检查是否 n > 2,如果为 true,则检查是否 n > 2x3,如果为 true,则检查 n > 2x3x4。这样您就知道要排列多少个尾部数组索引。然后,您必须确保以排序的线性方式计算排列,不会两次生成相同的排列。这是一个数学问题,编码本身应该相当简单(类似于在改变索引时切换位置n次)。
不确定这是否是您正在寻找的答案,但是制作一个独特的排列算法听起来相当复杂(例如,请参阅另一个问题的答案/sf/answers/799761791/),该答案链接到此维基百科关于按字典顺序生成的文章https://en.wikipedia.org/wiki/Permutation#Generation_in_lexicography_order 。
编辑:从 Raj Sharma 对你的问题的评论来看,这个关于生成排列的答案似乎也很有价值: https ://stackoverflow.com/a/37580979/3090583
| 归档时间: |
|
| 查看次数: |
393 次 |
| 最近记录: |