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

标签 javascript arrays combinations permutation

<分区>

尽管阅读了很多关于排列/组合的问答: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

最佳答案

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

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

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

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

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

关于Javascript 创建一个具有唯一值组合的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52886648/

相关文章:

javascript - ExpressJS : Misconfigured CSRF

javascript - IE8 条件 javascript 不链接

python - 如何切片 2D numpy 数组以获得它的直接邻居?

javascript - 对新数组的多重响应

python - 从 itertools 组合列表结果中删除括号

javascript - 在jsp页面中重新运行测试而不重新加载页面

javascript - 需要一个带有 multipart/form-data 的 AJAX Javascript 库

javascript - 在通过套接字发送到客户端之前压缩中等大小的 JavaScript 数组是否值得?

list - F#中元素的最优雅组合

从 n "randomly"的堆栈中查找 k 元素的所有组合的算法