Python 大小的每个可能子集的最大元素之和#x27;k';数组的
我有一个非常大的列表,包含大约10000个元素,每个元素都是一个50亿的整数。我想从最大大小为10000个元素的数组的大小“k”(由用户给定)的每个可能子集中找到最大元素的总和。我想到的唯一解决方案是生成每个子集(使用itertools)并找到其最大元素。但这将花费大量的时间!解决这个问题的python方法是什么?不要使用python,先使用数学。这是一个组合问题:如果有一个n个数(n个大)的数组Python 大小的每个可能子集的最大元素之和#x27;k';数组的,python,algorithm,subset,Python,Algorithm,Subset,我有一个非常大的列表,包含大约10000个元素,每个元素都是一个50亿的整数。我想从最大大小为10000个元素的数组的大小“k”(由用户给定)的每个可能子集中找到最大元素的总和。我想到的唯一解决方案是生成每个子集(使用itertools)并找到其最大元素。但这将花费大量的时间!解决这个问题的python方法是什么?不要使用python,先使用数学。这是一个组合问题:如果有一个n个数(n个大)的数组S,并生成大小为k的所有可能子集,则需要计算子集的最大元素之和 假设这些数字都是不同的(尽管如果不是
S
,并生成大小为k的所有可能子集,则需要计算子集的最大元素之和
假设这些数字都是不同的(尽管如果不是,也可以这样做),您可以精确计算每个数字出现在子集中的频率,并从那里开始,而不必实际构造子集。你应该把它转到math.stackexchange.com
,他们会马上把你搞定的。在这里,但没有漂亮的数学符号:
按递增顺序对数组排序,并让S_1
为最小(第一个)数,
S_2
下一个最小的,依此类推。(注:从1开始编制索引)
S\n
,最大的元素,显然是任何子集的最大元素
它是的一部分,并且确实存在(n-1选择k-1)
这样的子集(n-2选择k-1)
包含S_{n-1}
的子集,其中它是最大的元素suk
,第k个
(从最小的开始计算),这将是正好一个的最大值
子集:(k-1选择k-1)=1
。较小的数字(S_1
到S_{k-1}
)
不可能是最大的:每一组k
元素都将包含一些内容
更大的
(n-k+1项)
相加,您的答案如下:
S_n*(n-1 choose k-1) + S_{n-1}*(n-2 choose k-1) + ... + S_k*(k-1 choose k-1)
从最小值到最大值,这就是总和
Sum(i=k..n) S_i * (i-1 choose k-1)
如果我们在math.stackexchange上,你会得到正确的数学符号,但是你得到了这个想法
组合
是一个生成器,我假设程序不会在这里“挂起”。你能显示更多的代码吗?你的k
是什么<代码>二项式(10000,4)=416416712497500。除非k=9997
,否则在实践中,您永远无法完成10000个元素列表的所有组合。列表(itertools.compositions(range(5000),3))
将包含20820835000个元素。即使你是那个病人,你也几乎没有足够的记忆来储存这些信息。无论你想解决什么问题,如果是竞赛问题,那么有一种更聪明的方法来解决它,而不是手动循环,更不用说在内存中实例化庞大的列表了。@coding_pleasures:将其编辑到你的问题中。您刚刚成为的受害者,在这里,您不是询问您真正的问题,而是询问您尝试的解决方案。但无论如何,您可以编写一个for循环,该循环运行在itertools.combines()
生成的(大量)结果上。只是不要试图将它们全部收集到一个列表中——这就是迭代器如此有用的原因。如何标记迁移问题?我读过关于meta上当前系统的投诉,但是如果该网站没有出现在选项列表中,我不知道该怎么做……唯一的方法是招牌让版主注意。但我认为这个问题属于这里,而不是math.se,因为它是一个算法问题,涉及的数学是相当基本的。我认为一定有一个封闭形式的和,但我甚至不能在这个网站上写n-choose-k。但是让我看看。@alexis数字是不同的。不幸的是,我没有得到你的解决方案。你能解释一下如何精确计算每个数字在子集中出现的频率吗?“较小的数字永远不会是最大的。”这似乎不对。考虑<代码> k=1 < /代码>,答案是所有数字的总和,但是你的答案只考虑单个最大元素。