【问题标题】:Javascript create an array with unique combination of values [duplicate]Javascript创建一个具有唯一值组合的数组[重复]
【发布时间】:2019-03-24 00:11:53
【问题描述】:

尽管阅读了很多关于排列/组合的 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) 置换最后 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

控制台:n=100000 + 0,5,8,1,7,2,3,6,4,9 + 持续时间:0.004s

【问题讨论】:

  • 有可能,到目前为止,您是否尝试过编写任何代码?
  • 您真的需要对各种排列进行编号吗?仅仅有一个随机打乱的数组就足够了吗?
  • 你会考虑使用像generatorics这样的Node模块吗?
  • 嗯,听起来像 CS 练习,也许你可以展示你的代码。
  • @CertainPerformance 还没有,只是通过探索stackoverflow上的现有函数开始工作

标签: javascript arrays combinations permutation


【解决方案1】:

由于这个问题没有描述一个特定的编程问题,而是一个任务,而且是一个相当复杂的问题,你不应该期望一个完整的解决方案作为答案,但我会尝试描述一种可能的方法这个:

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

您可以检查是否 n > 2,如果为真,则检查是否 n > 2x3,如果为真,则检查是否 n > 2x3x4。这样你就会知道你想要置换多少个尾数组索引。然后,您必须确保以排序的线性方式计算排列,不会两次生成相同的排列。那是一个数学问题,编码本身应该相当容易(类似于在更改索引时切换位置 n 次)。

不确定这是否是您正在寻找的答案,但制作一个独特的排列算法听起来相当复杂(例如,请参阅另一个问题的答案https://stackoverflow.com/a/11425168/9521900),它链接到此维基百科文章https://en.wikipedia.org/wiki/Permutation#Generation_in_lexicographic_order on generate in字典顺序。

编辑:从 Raj Sharmas 对您的问题的评论来看,这个关于生成排列的答案似乎也很有价值: https://stackoverflow.com/a/37580979/3090583

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-29
    • 2019-02-12
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 2020-09-20
    • 2018-11-11
    • 1970-01-01
    相关资源
    最近更新 更多