假设我有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
对象。
我希望这会让事情更清楚。
答案 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循环。如果您不知道集合的数量,那么您可能会采用某种形式的递归来处理循环。
话虽如此,我认为你所做的是按照定义,效率不高。您是否有理由将所有可能的组合存储在内存中,而不是根据需要动态生成它们?