查找多个集合中的所有“和”组合

时间:2015-11-06 17:35:07

标签: arrays combinations

假设我有x个对象集,每个集都有一定数量的对象。我想创建一个数组,它将存储这些对象的所有唯一“和”组合。

例如,如果我在集合A中有5个对象,集合B中有10个对象,集合C中有8个对象,那么我知道从每个集合中挑选一个对象有5 * 10 * 8 = 400种独特方式。但我想将这些组合存储在一个数组中。

因此数组将是多维的,例如:

{
  { a, a, a }
  { a, a, b }
  { a, a, c }
  ...
  { a, b, a }
  { a, b, b }
  and so on...
}

我需要尽可能高效的解决方案,因为我正在处理可能有数千万种组合的情况。我不确定如何开始解决这个问题。

对不起,如果不清楚,但我真的不知道该怎么称呼我想要实现的目标,所以我只是尽力描述它。感谢您提供的任何帮助。

编辑:以下是有关该问题的更多信息:

这个问题的目的是我要从每个结果数组计算“得分”值。然后,我想找到最高n分数并将其返回给用户。所以实际上,我相信我不需要将整个数组放在内存中。我可以遍历数组,计算得分,如果得分足够高,则将其添加到返回的数组中。这样,我只需要内存中的顶级n对象。

我希望这会让事情更清楚。

2 个答案:

答案 0 :(得分:1)

快速python,可能无法提高效率,因为你需要在某个时候迭代......

getItems(A, B, C):
    for a in A:
        for b in B:
            for c in C:
                items = (a, b, c) ## or [a, b, c], as desired
                yield items

或者,如果您熟悉生成器表达式:

gen = ((a, b, c) for a in A for b in B for c in C)

然后使用:

for combo in getItems(A, B, C): ## or for combo in gen:
    ## do stuff here

编辑:

def getItems(*allSets):
    if len(allSets) == 0:
        yield []
        return
    thisSet, theRest = allSets[0], allSets[1:]
    for value in thisSet:
        for values in getItems(*theRest):
            yield [value] + values

答案 1 :(得分:0)

你知道设计时的套数吗?如果是这样,我会做嵌套for循环。如果您不知道集合的数量,那么您可能会采用某种形式的递归来处理循环。

话虽如此,我认为你所做的是按照定义,效率不高。您是否有理由将所有可能的组合存储在内存中,而不是根据需要动态生成它们?