Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/425.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 二项式子数组_Javascript_Arrays_Math - Fatal编程技术网

Javascript 二项式子数组

Javascript 二项式子数组,javascript,arrays,math,Javascript,Arrays,Math,我有一个长度为n的数组。 我想取所有可能的k(0) 例如,如果A的长度为5: [1,2,3,4,5] 若k=3,算法必须给我B数组 [1,2,3 ] [1,2, 4 ] [1,2, 5] [1, 3,4 ] [1, 3, 5] [1, 4,5] [ 2,3,4 ] [ 2,3, 5] [ 2, 4,5] [ 3,4,5] B的长度等于n!/k!(“!”表示阶乘,牛顿法) 我使用的是javascript,所以我在标记中包含了它,但它只是算法,不需

我有一个长度为n的数组。 我想取所有可能的k(0) 例如,如果A的长度为5:

[1,2,3,4,5]
若k=3,算法必须给我B数组

[1,2,3    ]
[1,2,  4  ]
[1,2,    5]
[1,  3,4  ]
[1,  3,  5]
[1,    4,5]
[  2,3,4  ]
[  2,3,  5]
[  2,  4,5]
[    3,4,5]
B的长度等于n!/k!(“!”表示阶乘,牛顿法)


我使用的是javascript,所以我在标记中包含了它,但它只是算法,不需要用javascript编写。

下面是我的一个项目的复制粘贴。不知道它是否仍然有效;)

var choose=函数choose\u func(elems,len){
var结果=[];

对于(var i=0;i您可以通过过滤方法来实现这一点

在您的示例中,您希望接收一个数组的所有排列,采用该数组中特定数量的元素

您可以以迭代的方式轻松地完成这项工作。 首先获取数组中
n-1
元素的所有排列:

// return all (n - 1) element permutations of an array
var permutations = function(arr) {
  return arr.reduce(function(re, value, i) {
    // add an array for each element in the original array
    return re.concat([arr.filter(function(v, index) {
      // drop each element with the same index
      return index !== i 
    })])
  }, [])
}
现在
置换([1,2,3])
将返回
[[1,2],[1,3],[2,3]]
假设源数组中只有唯一的值,那么这始终是一个不相交的集合

要接收5元素数组的所有3元素数组,首先计算4元素数组的列表,并将每个数组转换为3元素数组

permutations([1,2,3,4]).map(permutations)
=> [[1,2,3] => [[[1,2], [1,3], [2,3]]
   ,[1,2,4]    ,[[1,2], [1,4], [2,4]]
   ,[1,3,4]    ,[[1,3], [1,4], [3,4]]
   ,[2,3,4]    ,[[2,3], [2,4], [3,4]]
   ]           ]
显然,这里的问题是有双打。 这可以通过删除所有非唯一值来解决

var unique = function(arr) {
  var s = arr.map(function(v) { return "" + v })
  return arr.filter(function(v, i) { return s.indexOf("" + v) == i })
}
将其全部打包到一个函数中可以这样做:

var permutationsWithLength = function(arr, length) {
  var re = [arr]
  for (var i = arr.length; i >= length; i--) {
    re = re.reduce(function(tmp, perms) {
      return unique(temp.concat(permutations(perms)))
    }, [])
  }
  return re
}
我承认这可能不是最快的方法,特别是关于
unique
函数,但它是一种非常通用的方法,即使使用较大的数组,它也能解决您描述的问题


希望有帮助;)

查看可能的复制-甚至不是快速的方法,但我没有大数据,所以对我来说已经足够了。谢谢
var permutationsWithLength = function(arr, length) {
  var re = [arr]
  for (var i = arr.length; i >= length; i--) {
    re = re.reduce(function(tmp, perms) {
      return unique(temp.concat(permutations(perms)))
    }, [])
  }
  return re
}