在javascript中将所有分区查找为大小为2的集合

时间:2014-07-21 17:17:15

标签: javascript algorithm recursion set partition

我正在尝试编写执行以下操作的函数:

> partitions([a,b,c,d])

< [
  [[a,b],[c,d]],
  [[a,c],[b,d]],
  [[a,d],[b,c]]
  ]

即。它找到大小为2的所有分区。

目前我尝试递归地执行此操作:在每次调用时生成一对对列表,对于生成的每对,请在列表中再次调用该方法并删除该对。这有效,但它会产生重复。删除重复项需要比较生成的分区中的每个元素,这非常慢。

我想知道是否有更聪明的方法来做到这一点。

2 个答案:

答案 0 :(得分: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', 'b' ], [ 'c', 'd' ] ],
  [ [ 'a', 'c' ], [ 'b', 'd' ] ],
  [ [ 'a', 'd' ], [ 'b', 'c' ] ] ]

答案 1 :(得分:0)

一个好的策略是:

从头到尾

  1. 锁定一个元素(第一个元素)

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

  2. 锁定下一个元素(第二个元素)

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

  3. 3 ...重复直到最后一个元素

    视觉帮助:

    [a, ]
      [a, b]
      [a, c]
      [a, d]
    
    [b, ]
      [b, c]
      [b, d]
    
    [c, ]
      [c, d]