繁体   English   中英

列出所有可能的总和直到一定值

[英]Making list of all possible sums up to a certain value

我需要制定一种有效的算法,以从一个列表(包括它们自身)中获取所有可能的元素总和(编辑:成对),并将它们存储到另一个列表中,直至达到某个值。

例如,如果值是30,并且列表是[1,2,3,4,5,15,20] ,那么我想要的列表是:

[1,2,3,4,5,6,7,8,9,10,15,16,17,18,19,20,21,22,23,24,25,30]

现在,我有一个有效的算法,但效率极低(我需要这样做直到29000:

sumlist = [0]*60000
for j in range(0,len(abundlist)):
  for i in range(j,len(abundlist)):
    if sumlist[abundlist[i] + abundlist[j]] == 0: sumlist[abundlist[i] + abundlist[j]] = 1

如果总和发生了,我将1放在哪里,以避免相等的值。 我还尝试过从首富中消除所有倍数,但这根本没有帮助。

我认为我可能错误地解决了这个问题。 任何建议/优化/评论将非常有帮助。

您无需使用第一行在python中初始化列表。 使用列表理解来总结每一个数字位是很容易的:

>>> x=[1,2,3,4,5,15,20]
>>> [i+j for i in x for j in x]
[2, 3, 4, 5, 6, 16, 21, 3, 4, 5, 6, 7, 17, 22, 4, 5, 6, 7, 8, 18, 23, 5, 6, 7, 8, 9, 19, 24, 6, 7, 8, 9, 10, 20, 25, 16, 17, 18, 19, 20, 30, 35, 21, 22, 23, 24, 25, 35, 40]

如果要限制此范围,可以在理解的末尾添加一个简单的过滤器:

>>> [i+j for i in x for j in x if i+j<=30]
[2, 3, 4, 5, 6, 16, 21, 3, 4, 5, 6, 7, 17, 22, 4, 5, 6, 7, 8, 18, 23, 5, 6, 7, 8, 9, 19, 24, 6, 7, 8, 9, 10, 20, 25, 16, 17, 18, 19, 20, 30, 21, 22, 23, 24, 25]

如果需要唯一,则可以将其转换为集合,然后返回列表:

>>> list(set([i+j for i in x for j in x if i+j<=30]))
[2, 3, 4, 5, 6, 7, 8, 9, 10, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 30]

但是,集合是未排序的,返回列表的转换可能不一定保持顺序,因此您也可以像这样对它进行排序:

>>> sorted(list(set([i+j for i in x for j in x if i+j<=30])))
[2, 3, 4, 5, 6, 7, 8, 9, 10, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 30]

关于此效率:

这是一个有趣的小测试,显示执行总和,包括多次铸造和铸造集合和列表。 从本质上讲,它构建了一个从1到1000的数字列表(将权重取小一些,以匹配原始问题中的数字),然后如上所述执行求和。

建立和运行清单,并对其求和,需要100次,耗时不到2秒。

>>> timeit.timeit(
    'x=sorted(list(set([randint(1,i) for i in range(2,1000)])));z=[i+j for i in x for j in x if i+j<=500]',
    setup="from random import randint",number=100)
1.7806868553161621

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM