繁体   English   中英

在正数列表中找到相加为X的所有元素

[英]find all elements in a list of positive numbers that add up to number X

我正在尝试对遗留报告进行反向工程,并使用python解决问题。

旧版报告的最终总数为200,000。

我知道最终可能会达到200k的数字的集合,但是这个集合中散布着许多其他要过滤掉的数字(逻辑尚不明确)。

在python中,我如何遍历数字列表以查找长度可变(可能是1个元素等于200k,或15个元素的乘积...)的所有条目(子列表),它们的总和为200k ?

我开始写出来,然后决定当我意识到元素#1 + 2可能溢出但列出元素#1 + 4 + 7可能与200k匹配时寻求帮助。...

这几乎就像分解,但是用和而不是乘积,并在可能的候选列表内。

不确定。 有任何想法吗? 有人做过这样的事情吗?

额外细节:
有了排列和numpy,我得到了预期的结果,但是预期的输入和输出花费的时间太长了。 (即几天..?)

以下是我的位置:

尽管似乎需要一段时间,但以下似乎提供了正确的结果。

我接受上面的答案,让它过夜。

谢谢,

from itertools import permutations 
import numpy , pickle, random
output_results = {} 
input_array = [random.randrange(0,15000) for i in range(1000)]
desired_sum = 200000
#input_array = (1,2,9,13,12) 
#desired_sum = 23 

for r in range(1,len(input_array)): 
    for p in permutations(input_array, r):
        temp_sum = numpy.sum(p) 
        if temp_sum == desired_sum: 
            output_results[p] = numpy.sum(p) 
    if r % 10 == 0:
        print "Finished up to number %s " % r 

pickle.dump( output_results, open( "save.p", "wb" ) )

Itertools.permutations可以提供帮助。

改变rpermutations(iterable, r)permutations(iterable, r)您可以尝试从iterable (您的集合)中找到包含r项的所有可能排列,您可以轻松地求和(例如,使用numpy.sum )。

如果您对期望值有所了解并为r设置了合理的上限,那么您应该在合理的时间内得到答案。

编辑

@joefromct:您可以首先通过以下方式估算找到所需解决方案所需的r的最大值(未经测试,但思路应正确)

sorted_input = np.sorted(input_array)
cumsum = np.cumsum(sorted_input)
max_r = (cumsum<desired_sum).sum()
if max_r == len(input_array) and sorted_input[-1] < desired_sum:
    print("sorry I can't do anything for you")
    exit()

for r in range(1,max_r):
    [...]

暂无
暂无

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

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