【发布时间】:2020-09-08 21:39:20
【问题描述】:
我有一个数字列表Sn = [a, b, c, d, ...] 和一组不重叠的间隔Si = {I1, I2, I3, ...}。鉴于此,我的问题是找到Sn 子集的列表L,使得每个子集中的元素总和至少绑定到Si 内的一个区间内。
我现在的方法是枚举Sn 的所有子集,并根据它们是否适合一个区间来过滤它们。这是正确的,但效率低。
import itertools
Sn = [12, 30, 60, 6, 6]
Si = {(12, 12), (18, 24), (30, 48)}
def enumerate_sets():
sets = []
for i in range(len(Sn)):
for comb in itertools.combinations(Sn, i + 1):
for interval in Si:
if interval[0] <= sum(comb) <= interval[1]:
sets.append(comb)
break
return sets
print(enumerate_sets())
# [(12,), (30,), (12, 30), (12, 6), (12, 6), (30, 6), (30, 6), (6, 6), (12, 30, 6), (12, 30, 6), (12, 6, 6), (30, 6, 6)]
如何有效地实现这个子集问题?首选 python 中的答案,但任何(伪)语言都可以。
【问题讨论】:
-
您使用什么指标来衡量程序的“效率”?算法复杂度?内存消耗?实际运行时间?
-
@ethane 算法复杂性,虽然最终它的运行时间很重要,但我没有足够详尽的样本上关于运行时间的数据
-
请添加您的解决方案,以便我们了解您的解决方案的复杂性并更好地回答问题。
-
只是为了澄清-问题是找到Sn的所有子集的列表L?或者你想要一些特定的数量?
-
一组数字对你来说意味着一组唯一的数字,对吧?