Javascript创建具有唯一值组合的数组

时间:2018-10-19 06:01:22

标签: javascript arrays combinations permutation

尽管阅读了很多有关置换/组合的Q / A信息: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)排列最后两个符号(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

1 个答案:

答案 0 :(得分:0)

由于此问题不是描述特定的编程问题,而是描述一项任务,而在那个相当复杂的问题上,您不应期望使用完整的解决方案作为答案,但是我将尝试描述一种可行的解决方法这个:

正如您所说,排列的数量是2x3x4x ...

您可以检查n> 2,如果为true,则检查n> 2x3,如果为true,则检查n> 2x3x4。这样,您将知道要排列多少个尾部数组索引。然后,您必须确保以排序的线性方式计算排列,而不会两次生成相同的排列。多数民众赞成在数学上的问题,编码本身应该是很容易的(在改变索引时,将位置切换n次)。

不确定这是否是您要寻找的答案,但是使独特的置换算法听起来相当复杂(例如,参见另一个问题https://stackoverflow.com/a/11425168/9521900的答案),该链接链接到此维基百科文章{{3} }按字典顺序生成。

编辑:从Raj Sharmas对您的问题的评论中,此关于生成排列的答案似乎也很有价值: https://en.wikipedia.org/wiki/Permutation#Generation_in_lexicographic_order