我有一个算法,可以找到从元组列表中重复选择的k个元组的所有唯一和的集合。每个元组包含n个正整数,这些整数的顺序很重要,元组的和定义为逐元素相加。例如:(1, 2, 3) + (4, 5, 6) = (5, 7, 9)
k=2且n=3的简单示例:
input = [(1,0,0), (2,1,1), (3,3,2)]
solution = [(1,0,0)+(2,1,1), (1,0,0)+(3,3,2), (2,1,1)+(3,3,2), (1,0,0)+(1,0,0), (2,1,1)+(2,1,1), (3,3,2)+(3,3,2)]
solution = [(3,1,1), (4,3,2), (5,4,3), (2,0,0), (4,2,2), (6,6,4)]
实际上元组中的整数范围从0到50(在某些位置上可能会受到更多的限制,例如[0:2]),k最多有4种组合方式,元组的长度最多为5。要绘制的元组数量最多可达一千。
我目前使用的算法是一个适应于相关问题中提出的算法的改编版本,它比使用itertools枚举所有组合更有效率(如果我们从1000个元组中选择4个元组,则有数十亿种组合,但总和的数量将少得多),但我不知道如何将位集应用于这个问题。
# example where length of tuples n = 3:
lst = []
for x in range(0,50,2):
for y in range(0, 20, 1):
for z in range(0, 3, 1):
lst.append((x,y,z))
# this function works for any k and n
def unique_combination_sums(lst, k):
n = len(lst[0])
sums = {tuple(0 for _ in range(n))} # initialize with tuple of zeros
for _ in range(k):
sums = {tuple(s[i]+x[i] for i in range(n)) for s in sums for x in lst}
return sums
unique_combination_sums(lst, 4)
(6,6,4)
而不是(6,6,2)
。 - Luca Anzalone