在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);
一个好的策略是:

自始至终

  • 锁定一个元素(第一个元素)

    1.1迭代下一个元素(第二个直到结束),并创建对

  • 锁定下一个元素(第二个元素)

    2.1迭代下一个元素(第三个直到结束),并创建对

  • 3。。。重复此操作,直到最后一个元素

    视觉帮助:

    [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]