gpt4 book ai didi

javascript - 生成 JavaScript 数组的排列

转载 作者:行者123 更新时间:2023-12-03 01:28:40 25 4
gpt4 key购买 nike

我在javascript中有一个由n个不同元素组成的数组,我知道有n个!对这些元素进行排序的可能方法。我想知道生成该数组的所有可能顺序的最有效(最快)算法是什么?

我有这个代码:

var swap = function(array, frstElm, scndElm) {

var temp = array[frstElm];
array[frstElm] = array[scndElm];
array[scndElm] = temp;
}

var permutation = function(array, leftIndex, size) {

var x;

if(leftIndex === size) {

temp = "";

for (var i = 0; i < array.length; i++) {
temp += array[i] + " ";
}

console.log("---------------> " + temp);

} else {

for(x = leftIndex; x < size; x++) {
swap(array, leftIndex, x);
permutation(array, leftIndex + 1, size);
swap(array, leftIndex, x);
}
}
}

arrCities = ["Sidney", "Melbourne", "Queenstown"];
permutation(arrCities, 0, arrCities.length);

它确实有效,但我想交换每个项目来获取组合在内存方面有点昂贵,我认为这样做的一个好方法是只关注数组的索引并获取数字的所有排列,我想知道是否有一种方法可以计算所有这些,而无需切换数组中的元素?我想递归地可以获得所有这些,我需要帮助才能做到这一点。

例如,如果我有:

arrCities = ["Sidney", "Melbourne", "Queenstown"];

我希望输出是:

[[012],[021],[102],[120],[201],[210]]

或者:

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

我正在读这个: http://en.wikipedia.org/wiki/Permutation#Algorithms_to_generate_permutations

但是维基百科从来不擅长解释。我不太明白,我不得不说我的数学水平不是最好的。

最佳答案

此函数 perm(xs) 返回给定数组的所有排列:

function perm(xs) {
let ret = [];

for (let i = 0; i < xs.length; i = i + 1) {
let rest = perm(xs.slice(0, i).concat(xs.slice(i + 1)));

if(!rest.length) {
ret.push([xs[i]])
} else {
for(let j = 0; j < rest.length; j = j + 1) {
ret.push([xs[i]].concat(rest[j]))
}
}
}
return ret;
}

console.log(perm([1,2,3]).join("\n"));

关于javascript - 生成 JavaScript 数组的排列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37579994/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com