寻求高效计算等数量A、B元素排列数的Python解决方案(替代低效的itertools.product方法)
寻求高效计算等数量A、B元素排列数的Python解决方案(替代低效的itertools.product方法)
嘿,我太懂你遇到的麻烦了——用itertools.product生成所有可能的排列再筛选,n到30就慢得没法用,这太正常了,因为2^30可是超过10亿的数,生成这么多组合完全是资源浪费!
其实这个问题根本不需要暴力枚举,它本质是个组合数学问题:因为要让A和B的数量相等,而n是偶数,我们只需要从n个位置里选出n/2个位置放A(剩下的位置自然放B),这样的选法数量就是你要的排列数。你提到的序列2、6、20、70、252...正好对应组合数C(2,1)、C(4,2)、C(6,3)、C(8,4)、C(10,5)的结果。
下面给你几种高效的Python实现方案:
方案1:用Python内置的组合数函数(Python 3.10+)
从Python 3.10开始,math模块新增了comb函数,可以直接计算组合数,代码超简洁:
import math def count_equal_ab_permutations(n): if n % 2 != 0: return 0 # n为奇数时,A和B数量不可能相等 k = n // 2 return math.comb(n, k)
测试一下:输入n=2返回2,n=4返回6,完全匹配你给出的初始序列。
方案2:手动实现组合数计算(兼容低版本Python)
如果你的Python版本低于3.10,可以用约分的方式手动计算组合数,避免直接计算大数阶乘带来的性能问题:
def count_equal_ab_permutations(n): if n % 2 != 0: return 0 k = n // 2 result = 1 # 通过逐步约分计算组合数,避免大数溢出和冗余计算 for i in range(1, k + 1): result = result * (n - k + i) // i return result
这个方法的时间复杂度是O(n/2),就算n达到10000也能瞬间出结果,性能比暴力枚举强几个数量级。
举个例子,n=30时,用这个方法能直接得到结果155117520,而暴力枚举的话根本跑不完。
备注:内容来源于stack exchange,提问作者Joe Boyle
相关产品推荐
相关产品推荐

