生成JavaScript数组的排列

DSB*_*DSB 21 javascript arrays recursion permutation

我在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);
Run Code Online (Sandbox Code Playgroud)

它可以工作,但我想交换每个项目以获得组合是一个有点昂贵的内存明智,我认为这样做的好方法只是关注数组的索引并获得数字的所有排列,我是想知道是否有办法计算所有这些而不必在阵列中切换元素?我想递归可能得到所有这些,我需要帮助这样做.

所以,例如,如果我有:

arrCities = ["Sidney", "Melbourne", "Queenstown"];
Run Code Online (Sandbox Code Playgroud)

我希望输出为:

[[012],[021],[102],[120],[201],[210]]
Run Code Online (Sandbox Code Playgroud)

要么:

[[0,1,2],
 [0,2,1],
 [1,0,2],
 [1,2,0],
 [2,0,1],
 [2,1,0]]
Run Code Online (Sandbox Code Playgroud)

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

但维基百科从未擅长解释.我不太了解它,我不得不说我的数学水平不是最好的.

小智 27

此函数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"));
Run Code Online (Sandbox Code Playgroud)


小智 9

这只是为了好玩 - 我在一个字符串中递归解决

const perm = a => a.length ? a.reduce((r, v, i) => [ ...r, ...perm([ ...a.slice(0, i), ...a.slice(i + 1) ]).map(x => [ v, ...x ])], []) : [[]]
Run Code Online (Sandbox Code Playgroud)

  • 计算 11 个元素的排列需要很长时间。 (2认同)

le_*_*e_m 5

使用Heap的方法(您可以在本文中找到维基百科文章链接到的方法),您可以生成N个元素的所有排列,其中运行时复杂度为O(N!),空间复杂度为O(N).该算法基于交换元素.AFAIK的速度和它一样快,没有更快的方法来计算所有排列.

有关实现和示例,请查看我最近在相关问题"javascript中的排列"中的答案.