【发布时间】:2016-10-01 11:46:17
【问题描述】:
我在 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
但维基百科从来不善于解释。不是很懂,不得不说我的数学水平不是最好的。
【问题讨论】:
-
请解释您所说的“最有效”是什么意思。最快的?最低的内存使用率?
-
没有n!排列,除非您绝对确定数组中的所有 n 个元素彼此不同(或者,更好,可辨别)。如果两个元素无法区分,那么你的 n 就已经少了!排列(事实上,你会有重复排列)。
-
@EvanTrimboli 不一样,我想按索引而不是按元素来做
-
不太确定有什么不同。用数字替换名字也是同样的问题。
-
@EvanTrimboli 该方法必须将其中的元素切换为数组以实现所有排列,我猜这在速度(和内存)方面太昂贵了,我不擅长数学,但我的逻辑告诉我应该是一种计算范围内所有可能数字的方法,这样做比必须实际重新定位每个元素要快得多
标签: javascript arrays recursion permutation