Python 大小的每个可能子集的最大元素之和#x27;k';数组的

Python 大小的每个可能子集的最大元素之和#x27;k';数组的,python,algorithm,subset,Python,Algorithm,Subset,我有一个非常大的列表,包含大约10000个元素,每个元素都是一个50亿的整数。我想从最大大小为10000个元素的数组的大小“k”(由用户给定)的每个可能子集中找到最大元素的总和。我想到的唯一解决方案是生成每个子集(使用itertools)并找到其最大元素。但这将花费大量的时间!解决这个问题的python方法是什么?不要使用python,先使用数学。这是一个组合问题:如果有一个n个数(n个大)的数组S,并生成大小为k的所有可能子集,则需要计算子集的最大元素之和 假设这些数字都是不同的(尽管如果不是

我有一个非常大的列表,包含大约10000个元素,每个元素都是一个50亿的整数。我想从最大大小为10000个元素的数组的大小“k”(由用户给定)的每个可能子集中找到最大元素的总和。我想到的唯一解决方案是生成每个子集(使用itertools)并找到其最大元素。但这将花费大量的时间!解决这个问题的python方法是什么?

不要使用python,先使用数学。这是一个组合问题:如果有一个n个数(n个大)的数组
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 < /代码>,答案是所有数字的总和,但是你的答案只考虑单个最大元素。