这个Python程序优化以后减少2行代码但速度快了1亿亿亿倍

董付国老师Python系列教材(累计印刷超过200次)推荐与选用参考

开学第一课:一定不要这样问老师Python问题

3000道Python习题免费在线练习

“Python小屋”1400篇历史文章分类速查表

董付国老师Python教学PPT汇总与题库分享

==============

版权声明:由于公众号后台规则问题,本文暂时无法设置原创标记,但仍属原创内容,微信公众号“Python小屋”坚持只发原创技术文章。

=============

推荐教材:董付国著,《Python数据分析与数据可视化(微课版)》,ISBN:978-7-302-62420-2,清华大学出版社,2023年6月出版,2023年8月第2次印刷

配套资源:教学大纲、课件、源码、数据文件、34小时微课

724a38b7b2c89f706be1bb991c2c3c8b.jpeg

=============

问题描述:

查找所有n位黑洞数。这里黑洞数是指该自然数各位数字组成的最大数与最小数之差仍为原自然数本身,例如6174是4位黑洞数,有7641-1467=6174。

思路与优化:

对于上面的问题,很自然的想法是枚举所有n位数并检查是否为黑洞数。

d2963b5f1698305b143e638a14eeb2b1.png

当参数n较小时,上面的代码运行很好,但随着n的变大,代码运行时间急剧增加以至于无法忍受甚至在计算上不可行。

分析上面的代码,每次循环中的计算量并不大,之所以慢是因为循环次数太多,也就是搜索范围太大,并且其中很多测试是不必要的。

根据黑洞数的定义可知,同一组数字最多只能构成一个黑洞数,找到一个黑洞数之后这组数字的其他排列都可以直接跳过。

忽略顺序的话可以使用组合来求解,又因为黑洞数的各位数字是允许重复的,所以需要借助于允许重复的组合来求解。

1868cd7eafa10e93002d2198183ecdfc.png

同样是穷举算法,改写后的代码没有多余的测试,每组数字只测试一次,大幅度减少了搜索范围。那么效率提升具体怎样呢,写几行代码测试和比较一下,红色下画线为第一个函数的运行时间(单位:秒),绿色下画线为改写后第二个函数的运行时间。可以看到,在位数并不太大的时候,效率已经提升了几十万倍。

cfa024ae6407ffabd325f473437586b6.png

运行结果:

b9fec0d6254b4f909b536daccfd28668.png

稍微改写代码,继续增加位数长度并单独测试第二个函数,第一个函数对于这样的长度已经无能为力了。n=28时第一个函数的搜索范围约为10**27,第二个函数搜索范围为组合数C(10+28-1,28)=124403620,第一个函数是第二个函数的10**18倍。n=35时,第一个函数的搜索范围约为10**34,第二个函数搜索范围为组合数C(10+35-1,35)=708930508,第一个函数是第二个函数的10**25倍。

91cb69d8cfd201114350f11a352d94fe.png

运行结果:

cc93279694dba8d9038dfaef39e4d057.png

=================

温馨提示:

关注微信公众号“Python小屋”,在公众号后台发送消息“大事记”可以查看董付国老师与Python有关的重要事件;发送消息“教材”可以查看董付国老师出版的Python系列教材(已累计印刷超过200次)的适用专业详情;发送消息“历史文章”可以查看董付国老师推送的超过1300篇原创技术文章;发送消息“会议”可以查看近期董付国老师的培训安排;发送消息“微课”可以查看董付国老师免费分享的超过700节Python微课视频;发送消息“课件”可以查看董付国老师免费分享的Python教学资源;发送消息“小屋刷题”可以下载“Python小屋刷题神器”,免费练习3857道客观题和782道编程题,题库持续更新;发送消息“编程比赛”了解Python小屋编程大赛详情。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值