求列中满足和≥总和50%的最少数据点数量的紧凑实现方案
求列中满足和≥总和50%的最少数据点数量的紧凑实现方案
嘿,这个需求我刚好碰过类似的,其实用Excel的函数就能写出超紧凑的解决方案,不管你列里有几百还是几千条数据,都能瞬间出结果,而且复制到8列上复用特别方便。
核心思路很简单:要找最少的数据点,肯定得优先加最大的数对吧?所以我们先把列里的数从大到小排序,然后逐个累加,找到第一个累加和达到总和50%的位置,这个位置就是你要的数量。
针对Excel 365/2021(支持动态数组和LAMBDA)的紧凑公式
如果你的Excel是新版本,直接用这个公式就行,比如针对A列:
=MATCH(TRUE, SCAN(0, SORT(A:A,,-1), LAMBDA(acc, val, acc+val)) >= SUM(A:A)*0.5, 0)
我给你拆解下每个部分:
SORT(A:A,,-1):把A列数据从大到小排序,确保我们先加最大的数,用最少的数量凑够阈值SCAN(0, ..., LAMBDA(acc, val, acc+val)):对排序后的数组做累加,生成一个累加和数组——第一个元素是最大的数,第二个是前两大的数的和,以此类推>= SUM(A:A)*0.5:判断每个累加和是否达到总和的50%,得到一串TRUE/FALSE的结果MATCH(TRUE, ..., 0):找到第一个TRUE出现的位置,这个就是满足条件的最少数据点数量
旧版Excel(无动态数组)的替代方案
如果你的Excel版本比较旧,没法用LAMBDA函数,可以用这个数组公式(输入的时候要按Ctrl+Shift+Enter):
=MATCH(TRUE, SUBTOTAL(9, OFFSET(A1,0,0,ROW(INDIRECT("1:"&COUNTA(A:A))),1))>=SUM(A:A)*0.5,0)
注意:用这个公式前,需要先手动给目标列做降序排序,确保最大的数在最前面。
验证你的例子
你提到的0-100的列,总和是5050,50%就是2525。用第一个公式计算的话,前30大的数是71到100,它们的和是(71+100)*30/2=2565,刚好超过2525;而前29大的数和是2494,不够。公式会准确返回30,完全符合你的预期。
复用技巧
要用到8列上的话,直接把公式里的A:A换成对应的列(比如B:B、C:C)就行,复制粘贴8次,全程不用改其他参数,超级省事。
备注:内容来源于stack exchange,提问作者Alex Robinson
相关产品推荐
相关产品推荐

