数组中所有属性的组合

时间:2014-09-26 19:26:27

标签: javascript combinatorics

好的,过去几天我一直在为此烦恼。什么是最好的(没有巨大开销的任何东西)生成所有可能组合的数组的方法

var input = [
    {a: 1}, {a: 2, b: 3},
    {b: 4}, {b: 5}, {a: 6}
];

所以我希望产生以下内容:

var output = [
    {a: 1}, {b: 4}, {b: 5}, {a: 6},
    {a: 1, b: 4}, {a: 1, b: 5},
    {a: 6, b: 4}, {a: 6, b: 5},
    {a: 2, b: 3}
];

事情是,在我的具体情况下,我在谈论4个属性(我实际上需要为每组不同的属性集生成一个单独的数组,但这些都是我以后应该能够自己实现的东西) 。然而,我正在寻找的只是一些关于如何处理这个问题的通用伪代码,而不是为我编写它或类似的东西。

我觉得这应该是我应该能够理解的东西,但我只是没有到达那里。首先,我为所有属性组合生成单独的数组(所有a' s,所有b' s,所有c' s,所有{{1所有ab' s等等。但事情是,对于每个bc所有ab&{39}和c& #39; S。现在,为单个属性写出来很简单,但编写一个通用的解决方案,为n属性做这些只是完全逃避我。

1 个答案:

答案 0 :(得分:3)

我不确定我是否真的理解这些要求,但您可以尝试这些行的递归解决方案(伪代码而非javascript):

def generate(i,C):
    # C is a dictionary representing the currently defined properties
    # We are allowed to add to our set of properties from the choices input[i],input[i+1],...

    # First choose a non-conflicting set of additional properties to add
    while i<len(input):
        if all of properties in input[i] are not in C:
             Add properties in input[i] to C
             solutions.append(C)
             generate(i+1,C)
             Remove properties in input[i] from C
        i++

generate(0,{})