社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

“好串”求解算法优化原理与Python实现

Python小屋 • 8 年前 • 672 次点击  

佩服国防科大刘万伟老师的数学功底与编码功底,感谢刘老师无私分享!



=====正文=======

题目要求:称一个 0-1 串是“好串”,如果它的任何子串不在其中连续出现三次以上。编写程序,输入正整数 n,输出某个长度为 n 的好串。

在数学学上可以证明:存在任意长度的好串。事实上,若 w 是一个长度为 k 的好串,将 w 中的 0 和 1 分别替换为 01 和 10 必然是一个长度为 2k 的好串(感兴趣的读者可以用反证法证明);同时,好串的任意子串必然也是好串。

显然,单独的 0 和 1 都是好串,根据上面的性质,可以得到任意长度的好串。根据这个思路(称为“标准迭代”),可以写出下面的代码:

这个程序只有四行,算是十分短小精悍的。但是,它的可读性并不好:同时,还用到了 lambda 表达式、map 函数、字符串与列表的相互转化等十分复杂的机制;更重要的是,它的执行效率不高。

这时,应当仔细分析一下这个问题的特殊性 —— 考虑下面的 01-串序列:0、01、0110、01101001、…… (其规律为:下一个串是在上一个串的基础上添加原串的对偶串(即按位取反的串)获得)。
不难归纳证明:如果用 0 作为起始好串,上面的串列与按照标准方式迭代的序列恰好一样。

按位取反可以通过与一个全 1 序列进行异或操作得到,这样就获得了下面的代码:

细节:倒数第二行之所以需要切片操作,是因为要把异或后字串的符号位去掉。

这样,代码的效率与可读性较之于第一个版本有了大幅度的提高。但是,循环体代码里面仍然存在着进制转换、移位、求长度、切片等操作,效率仍然不是十分令人满意。同时,总感觉该问题某些特殊的性质没利用上!什么性质呢?—— 对!就是“对称性”!!!

想到了这三个字,代码的样子马上就会发生翻天覆地的变化!

这时,你可能不太相信,解决这个问题的代码竟可以简单成这样:循环体中,只存在简单的字串连接操作!

但是,冷静!这是仍然应该问一下自己:还能继续优化吗? 中国传媒大学胡凤国老师敏锐的指出:这段代码跟原来比,多耗费了一倍的空间!

这的确是一个问题!怎么解决呢?事实上,串的长度每次增加一倍,这个“浪费”只出现在循环的最后一步!如果我们让循环少做一次,不就可以了吗? 终极代码如下:



----------相关阅读----------

教学课件

1900页Python系列PPT分享一:基础知识(106页)

1900页Python系列PPT分享二:Python序列(列表、元组、字典、集合)(154页)

1900页Python系列PPT分享三:选择与循环结构语法及案例(96页)

1900页Python系列PPT分享四:字符串与正则表达式(109页)

1900页Python系列PPT分享五:函数设计与应用(134页)

1900页Python系列PPT分享六:面向对象程序设计(86页)

1900页Python系列PPT分享七:文件操作(132页)

1900页Python系列PPT分享八:异常处理结构与程序调试、测试(70页)

报告PPT(163页):基于Python语言的课程群建设探讨与实践


系列题库分享

1000道Python题库系列分享一(17道)

1000道Python题库系列分享二(48道)

1000道Python题库系列分享三(30道)

1000道Python题库系列分享四(40道)

1000道Python题库系列分享五(40道)

1000道Python题库系列分享六(40道)

1000道Python题库系列分享七(30道)

1000道Python题库系列分享八(29道)

1000道Python题库系列分享九(31道)


相关技术文章

Python使用超高效算法查找所有类似123-45-67+89=100的组合

Python查找所有类似于123-45-67+89 = 100的组合

数学老师从没这么教过,乘法竖式中进位可以是多位(附Python实现与测试源码)

计算Fibonacci数列第n项的第8种方法(数学推导与Python实现)

使用Python模拟伪随机数生成原理

使用Python模拟蒙蒂霍尔悖论游戏

使用Python编写一个聪明的尼姆游戏

蒙特.卡罗方法求解圆周率近似值原理与Python实现

两行Python代码实现电影打分与推荐

Python按位异或运算符^应用案例一则:查找只出现一次的数字



闲聊

董付国老师《Python程序设计基础》完美落幕

又一个学期结束了,送给在校大学生几句话

淡定!不要因为纳入了高考和二级考试甚至极个别小学课程就盲目夸大Python!

全国计算机等级考试二级Python考试大纲预测和分析

大家都在学Python,你和别人的差距在哪?

大学生们颤抖吧,中学生已经开始学Python了!

祝所有程序员1024节日快乐

学会提问,你就成功了一大半!

盘点那些让人上火的提问方式(论如何让交流更高效)



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

1、董付国老师Python系列教材,亚马逊、京东、当当、天猫均有销售:

《Python程序设计基础》(2018年2月第6次印刷)

《Python程序设计(第2版)》(2018年2月第5次印刷)

《Python可以这样学》(2018年2月第5次印刷)(本书已被引入台湾发行繁体版)

《Python程序设计开发宝典》(2018年2月第3次印刷)

《中学生可以这样学Python》

《Python程序设计基础(第2版)》(2018年3月隆重上市)

董付国老师6本Python系列图书阅读指南

董付国老师6本Python系列教材被北大、复旦等近百所高校选作教材

热烈庆祝《Python可以这样学》在台湾发行繁体版


2、董老师120课免费视频地址: https://pan.baidu.com/s/1jJeAs8Q 密码: px59


3、董老师CSDN学院9套“Python可以这样学”收费视频课程汇总地址:https://edu.csdn.net/search?keywords=%E8%91%A3%E4%BB%98%E5%9B%BD&type=0



今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/mFzQhRErVj
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/9686