Python版组合数计算方法优化思路和源码

总体说明:本文的优化思路并不局限于Python,但C、C++、C#、Java等语言无法使用内置类型直接表示大整数,需要通过数组等特定形式并自己实现大整数乘除法才能实现,因此本文只介绍Python语言的实现。

按照标准的组合数公式,再结合Python标准库的阶乘函数factorial(),很容易写出下面的代码:

def cni(n, i):
    from math import factorial
    return factorial(n) // factorial(i) // factorial(n-i)

但是,在上面代码的执行过程中,很多计算是重复的,于是我在《Python可以这样学》和《Python程序设计开发宝典》中给出了下面的优化思路和代码,大幅度减少了重复的计算,提高了计算效率。主要思路是对组合数计算公式的分子分母进行展开,并约去重复计算。

def cni1(n,i):
    result=1
    Min,Max=sorted((i, n-i))
    for i in range(n,0,-1):
        if i> Max:
            result *=i
        elif i <= Min:
            result =result // i
    return result

非常感谢浙江温州永嘉县教师发展中心应根球老师又对这个算法进行了进一步优化,提供了下面的两段等价代码,通过自然数分布的对称性和一乘一除的结合,有效避免了中间结果过大而导致效率降低的问题。

def cni2(n,i):
    result = 1
    for j in range(0, i):
        result = result * (n-j) // (j+1)
    return result

def cni3(n,i):
    result = 1
    for j in range(1, i+1):
        result = result * (n-i+j) // j
    return result

下面是测试代码,大家可以修改参数进行更多测试,也欢迎提供更好的优化思路和代码。

n = 100000
i = 52019
print(cni1(n,i))
print(cni(n,i) == cni1(n,i)==cni2(n,i)==cni3(n,i))

----------喜大普奔----------

1、继《Python程序设计基础》《Python程序设计(第2版)》《Python可以这样学》系列图书之后,董付国老师新书《Python程序设计开发宝典》已于2017年8月1日在清华大学出版社出版。为庆祝新书《Python程序设计开发宝典》全面上架,清华大学出版社联合“赣江图书专营”淘宝店推出特价优惠活动,《Python程序设计开发宝典》原价69元,新书上架期间超低价39.8元,可以复制下面的链接使用浏览器打开查看图书详情和购买:

https://detail.tmall.com/item.htm?spm=a1z10.3-b-s.w4011-14464369246.84.46f16db0roWfX4&id=557107249812&rn=339cbc9df2bac424664103917dedfbd2&abbucket=8&tbpm=3

2、10月13日——15日,重庆,全国高校程序设计系列课程高级研究班,详见:全国高校程序设计系列课程高级研修班(Python)通知

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dongfuguo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值