Javascript创建一个具有唯一值组合的数组[重复]

Posted

技术标签:

【中文标题】Javascript创建一个具有唯一值组合的数组[重复]【英文标题】:Javascript create an array with unique combination of values [duplicate] 【发布时间】: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 还没有,只是通过探索***上的现有函数开始工作 【参考方案1】:

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

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

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

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

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

【讨论】:

以上是关于Javascript创建一个具有唯一值组合的数组[重复]的主要内容,如果未能解决你的问题,请参考以下文章

基于具有唯一值的数组创建多个动态选择过滤器以过滤 Vue.js 中的另一个数组

JavaScript,从几个数组中获取所有唯一组合[重复]

Javascript数组递归问题 - 遍历“部分”

从字符串数组创建唯一组合数组

用javascript输出数字数组的每个组合

在一个集合的所有文档中具有唯一值的数组