在javascript中查找大小为2的所有分区集
我正在尝试编写一个函数,该函数执行以下操作:在javascript中查找大小为2的所有分区集,javascript,algorithm,recursion,set,partition,Javascript,Algorithm,Recursion,Set,Partition,我正在尝试编写一个函数,该函数执行以下操作: > partitions([a,b,c,d]) < [ [[a,b],[c,d]], [[a,c],[b,d]], [[a,d],[b,c]] ] >分区([a,b,c,d]) < [ [a,b],[c,d], [a,c],[b,d], [a,d],[b,c]] ] i、 e.它查找大小为2的所有分区 目前,我正在尝试递归地执行此操作:在每次调用时生成一个对列表,对于生成的每个对,在移除该对的情况下再次调用该列表中的
> partitions([a,b,c,d])
< [
[[a,b],[c,d]],
[[a,c],[b,d]],
[[a,d],[b,c]]
]
>分区([a,b,c,d])
< [
[a,b],[c,d],
[a,c],[b,d],
[a,d],[b,c]]
]
i、 e.它查找大小为2的所有分区
目前,我正在尝试递归地执行此操作:在每次调用时生成一个对列表,对于生成的每个对,在移除该对的情况下再次调用该列表中的方法。这是可行的,但会生成重复项。删除重复项需要比较生成的分区中的每个元素,这非常慢
我想知道是否有一种更聪明的方法可以做到这一点。只需获得所有项目的组合,然后过滤掉所有不需要的项目,就像这样
function getTwoCombinations(array) {
var i, j, result = [];
for (i = 0; i < array.length; i += 1) {
for (j = i + 1; j < array.length; j += 1) {
result.push([array[i], array[j]]);
}
}
return result;
}
var result = getTwoCombinations(getTwoCombinations(["a", "b", "c", "d"])).
filter(function(items) {
return items[0].every(function(item) {
return !(items[1].indexOf(item) + 1);
});
});
console.log(result);
一个好的策略是:
自始至终
[a, ]
[a, b]
[a, c]
[a, d]
[b, ]
[b, c]
[b, d]
[c, ]
[c, d]
我认为另一种方法是生成循环移位前唯一的所有置换,然后按索引对结果进行分组。有没有一种有效的方法来生成所有与循环无关的排列(无需通过暴力移除循环排列)?只生成所有组合,而不是分区,没有?如果列表按顺序排列,它也将返回分区,这难道不正确吗?按什么顺序排列?当然,分区是您在这里生成的这些东西的子集,但是很明显如何对它们进行分组吗?谢谢,这非常简单。不知何故,我说服自己,这样做会很慢,但显然不是这样,所以谢谢你。不过,问题是,这似乎不适用于任何超过4个元素的情况。我们需要将gettwombinations推广到一个构造任意数量的对的组合,getNCombinations,并替换gettwombinations(gettwombinations)(…)与getNCombinations(gettwombinations(…),N),其中N很容易根据列表大小确定。
[a, ]
[a, b]
[a, c]
[a, d]
[b, ]
[b, c]
[b, d]
[c, ]
[c, d]