【发布时间】:2020-09-22 12:35:10
【问题描述】:
所以最近我一直在尝试解决一些有趣的问题,但一直卡在这个问题上。
给定一组对象 1 到 N。n1 个值为 0 的对象和 n2 个值为 1 的对象和 n3 个值为 2 的对象。 需要计算总和为 3 或其倍数的所有子集。
n1+ n2 + n3 = N
我已经能够解决这个问题,但无法降低这个问题的时间复杂度。 我的解决方案仍然具有指数时间复杂度。我正在尝试降低时间复杂度,以便我可以在 5 秒内运行 N = 100,000 的大型集合。
这是我偶然发现的另一个简单但直观的解决方案,但时间复杂度又是问题所在。
def mask(lst, m):
# pad number to create a valid selection mask
# according to definition in the solution laid out
m = m.zfill(len(lst))
return map(lambda x: x[0], filter(lambda x: x[1] != '0', zip(lst, m)))
def subset_sum(lst, target):
# there are 2^n binary numbers with length of the original list
for i in range(2**len(last)):
# create the pick corresponsing to current number
pick = mask(lst, bin(i)[2:])
if sum(pick) == target:
yield pick
我不需要确切的编码解决方案,但如果你能指出我正确的方向并且任何编程语言都可以,我想知道解决方案的逻辑/方法。
【问题讨论】:
-
这里C++的工作是什么?
-
仅仅因为您对几种编程语言持开放态度并不是标记所有这些语言的理由。仅标记您的 sn-p 代码的语言
-
虽然可以是很多子集。您需要计算它们还是列出它们?
-
我的意思是可能有指数级的子集适合,所以如果你列出它们,你永远无法达到 100 000(或 1 000)。
-
@ChristianSloper 我只需要数一数。
标签: python python-3.x algorithm subset-sum