Javascript 二项式子数组
我有一个长度为n的数组。 我想取所有可能的k(0) 例如,如果A的长度为5: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,所以我在标记中包含了它,但它只是算法,不需
[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
}