Python 查找文本文件中50个数字中10个数字的最低覆盖率

Python 查找文本文件中50个数字中10个数字的最低覆盖率,python,for-loop,math,finance,accounting,Python,For Loop,Math,Finance,Accounting,所以基本上我有一个文本文件,有50个coveriance数,从零开始大约(正负)1*10^{-6}。我试着从数据集中找出10个数字,这些数据给了我最接近数字0的千个数字的总和。在python中,通过迭代所有数字并从50个数字中找到10个数字(这使我的数字最接近于零),有没有办法做到这一点?希望这个问题有意义:/使用itertools.compositions,应该需要不到一个小时的时间: min(combinations(numbers, 10), key=lambda c: abs(sum(c

所以基本上我有一个文本文件,有50个coveriance数,从零开始大约(正负)1*10^{-6}。我试着从数据集中找出10个数字,这些数据给了我最接近数字0的千个数字的总和。在python中,通过迭代所有数字并从50个数字中找到10个数字(这使我的数字最接近于零),有没有办法做到这一点?希望这个问题有意义:/

使用
itertools.compositions
,应该需要不到一个小时的时间:

min(combinations(numbers, 10), key=lambda c: abs(sum(c)))

更快的想法:将数字分成两组A和B,每组25个数字。从A取i数,从B取10-i数(尝试从0到10的所有i数)

例如,当从A中取3个数字,从B中取7个数字时,A中有25C3=2300个组合,B中有25C7=480700个组合。按和对B中的组合进行排序,然后对A中的组合进行二元搜索,在B中找到与A中的组合相结合的最佳组合

对于i>5,也就是说,当从A中获取的数字多于从B中获取的数字,因此从A中获取的组合多于从B中获取的组合时,请将从A中获取的数字排序,然后对从B中获取的数字和从A中获取的数字进行二元搜索

每个组合需要更多的精力,但总的来说组合要少得多,所以我认为它会更快:

>>> from math import comb

>>> comb(50, 10)
10272278170

>>> sum(comb(25, i) + comb(25, 10-i) for i in range(11))
14239032

>>> 10272278170 / 14239032
721.4168891537009

带附加和的组合的创建和排序应占用大部分时间。对于i使用
itertools执行此操作需要30秒。组合
所需时间应少于一小时:

min(combinations(numbers, 10), key=lambda c: abs(sum(c)))

更快的想法:将数字分成两组A和B,每组25个数字。从A取i数,从B取10-i数(尝试从0到10的所有i数)

例如,当从A中取3个数字,从B中取7个数字时,A中有25C3=2300个组合,B中有25C7=480700个组合。按和对B中的组合进行排序,然后对A中的组合进行二元搜索,在B中找到与A中的组合相结合的最佳组合

对于i>5,也就是说,当从A中获取的数字多于从B中获取的数字,因此从A中获取的组合多于从B中获取的组合时,请将从A中获取的数字排序,然后对从B中获取的数字和从A中获取的数字进行二元搜索

每个组合需要更多的精力,但总的来说组合要少得多,所以我认为它会更快:

>>> from math import comb

>>> comb(50, 10)
10272278170

>>> sum(comb(25, i) + comb(25, 10-i) for i in range(11))
14239032

>>> 10272278170 / 14239032
721.4168891537009

带附加和的组合的创建和排序应占用大部分时间。这样做需要30秒i@SumnerEvans,我想你误读了这个问题,(签名的)总数需要接近0。我想这相当棘手,以太的50个选择10个组合值的选项,总共是10272278170个选项,从100个值中选择10个值。这是可行的,但需要一些时间来计算。您可能需要比遍历所有选项更智能的东西。是否可以使用solver在Excel中执行此操作?哦,我明白了(facepalm)。这绝对是NPC@哦,你可以使用
itertools.compositions
,但正如@Leander所说,这将需要很长时间。哈哈,我想你错过了一些东西:P@SumnerEvans,我想你误读了这个问题,(签名的)总数需要接近0。我想这相当棘手,以太的50个选择10个组合值的选项,总共是10272278170个选项,从100个值中选择10个值。这是可行的,但需要一些时间来计算。您可能需要比遍历所有选项更智能的东西。是否可以使用solver在Excel中执行此操作?哦,我明白了(facepalm)。这绝对是NPC@哦,你可以使用
itertools.compositions
,但正如@Leander所说,这需要很长时间。哈哈,我想你错过了什么:P50 choose 10是10272278170,这对于暴力尝试来说似乎太过分了。@nanofard他们只要求“任何方式”,而不是快速方式。而且应该不到一个小时。此外,它还可以用于检查更快的解决方案的正确性。我想到了一个更快的解决方案,但这需要更多的工作,而且已经很晚了。因此,如果他们这样做而不是问问题,他们现在可能已经有了结果:-D@nanofarad添加了我关于更快的想法。50 choose 10是10272278170,这对于暴力尝试来说似乎太过分了。@nanofarad他们只要求“任何方式”,不是为了一个快速的方式。而且应该不到一个小时。此外,它还可以用于检查更快的解决方案的正确性。我想到了一个更快的解决方案,但这需要更多的工作,而且已经很晚了。因此,如果他们这样做而不是问问题,他们现在可能已经有了结果:-D@nanofarad增加了我关于更快的想法。