前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python版组合数计算方法优化思路和源码

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

作者头像
Python小屋屋主
发布2018-04-16 15:40:47
2.1K0
发布2018-04-16 15:40:47
举报
文章被收录于专栏:Python小屋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))

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-09-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python小屋 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档