()-5<10写4和10的最小公倍数的

您所在的位置: &
选取序列中最小的第n个元素
选取序列中最小的第n个元素
人民邮电出版社
《Python Cookbook(第2版)中文版》第5章,引言由Tim Peters撰写,本章覆盖了Python中的搜索和排序技术。很多例子展示了将稳定快速的list.sort和decorate-sort-undecorate(DSU)(在Python 2.4中新导入的能力)结合在一起的创造性的应用,其余例子还展示了heapq、bisect的威力,并介绍了Python中其他的搜索和排序工具。本节为大家介绍选取序列中最小的第n个元素。
5.10& 选取序列中最小的第n个元素
感谢:Raymond Hettinger、David Eppstein、Shane Holloway、Chris Perkins
需要根据排名顺序从序列中获得第n个元素(比如,中间的元素,也被称为中值)。如果序列是已经排序的状态,应该使用seq[n],但如果序列还未被排序,那么除了先对整个序列进行排序之外,还有没有更好的方法?
如果序列很长,洗牌洗得很充分,而且元素之间的比较开销也大,那么也许还能找到更好的方式。排序的确很快,但不管怎样,它(一个长度为n的充分洗牌的序列)的时间复杂度仍然是O(nlogn),而时间复杂度为O(n)的取得第n个最小元素的算法也的确是存在的。下面我们给出一个函数来实现此算法:import&random &def&select(data,&n): &&&&&&&"&寻找第n个元素&(最小的元素是第0个).&" &&&&&&&#&创建一个新列表,处理小于0的索引,检查索引的有效性 &&&&&&&data&=&list(data) &&&&&&&if&n&&&&&&&&&&&&n&+=&len(data) &&&&&&&if&not&0&=&n&&(data): &&&&&&&&&&&&raise&ValueError,&"can't&get&rank&%d&out&of&%d"&%&(n,&len(data)) &&&&&&&#&主循环,看上去类似于快速排序但不需要递归 &&&&&&&while&True: &&&&&&&&&&&&pivot&=&random.choice(data) &&&&&&&&&&&&pcount&=&0&&&&&&&&&&&&under,&over&=&[&&],&[&&] &&&&&&&&&&&&uappend,&oappend&=&under.append,&over.append &&&&&&&&&&&&for&elem&in&data: &&&&&&&&&&&&&&&&&if&elem&&&&&&&&&&&&&&&&&&&&&&&&&uappend(elem) &&&&&&&&&&&&&&&&&elif&elem&&pivot: &&&&&&&&&&&&&&&&&&&&&&&oappend(elem) &&&&&&&&&&&&&&&&&else: &&&&&&&&&&&&&&&&&&&&&&&pcount&+=&1 &&&&&&&&&&&&numunder&=&len(under) &&&&&&&&&&&&if&n&&&&&&&&&&&&&&&&&&&data&=&under&&&&&&&&&&&&elif&n&&&+&pcount: &&&&&&&&&&&&&&&&&return&pivot &&&&&&&&&&&&else: &&&&&&&&&&&&&&&&&data&=&over&&&&&&&&&&&&&&&&&n&-=&numunder&+&pcount&
本节解决方案也可用于重复的元素。举个例子,列表[1, 1, 1, 2, 3]的中值是1,因为它是将这5个元素按顺序排列之后的第3个。如果由于某些特别的原因,你不想考虑重复,而需要缩减这个列表,使得所有元素都是唯一的(比如,通过18.1节提供的方法),可以完成这一步骤之后再回到本节的问题。
输入参数data可以是任意有边界的可迭代对象。首先我们对它调用list以确保得到可迭代的对象,然后进入持续循环过程。在循环的每一步中,首先随机选出一个轴心元素;以轴心元素为基准,将列表切片成两个部分,一个部分"高于"轴心,一个部分"低于"轴心;然后继续在下一轮循环中对列表的这两个部分中的一个进行深入处理,因为我们可以判断第n个元素处于哪一个部分,所以另外一个部分就可以丢弃了。这个算法的思想很接近经典的快速排序算法(只不过快速排序无法丢弃任何部分,它必须用递归的方法,或者用一个栈来替换递归,以确保对每个部分都进行了处理)。
随机选择轴心使得这个算法对于任意顺序的数据都适用(但不同于原生的快速排序,某些顺序的数据将极大地影响它的速度);这个实现花费大约log2N时间用于调用random.choice。另一个值得注意的是算法统计了选出轴心元素的次数,这是为了在一些特殊情况下仍能够保证较好的性能,比如data中可能含有大量的重复数据。
将局部变量列表under和over的被绑定方法append抽取出来,看起来没什么意义,而且还增加了一点小小的复杂性,但实际上,这是Python中一个非常重要的优化技术。为了保持编译器的简单、直接、可预期性以及健壮性,Python不会将一些恒定的计算移出循环,它也不会"缓存"对方法的查询结果。如果你在内层循环调用under.append和over.append,每一轮都会付出开销和代价。如果想把某些事情一次性做好,那么需要自己动手完成。当你考虑优化问题时,你总是应该对比优化前和优化后的效率,以确保优化真正起到了作用。根据我的测试,对于获取range(10 000)的第5 000个元素这样的任务,去掉优化部分之后,性能下降了50%。虽然增加一点小小的复杂性,但仍然是值得的,毕竟那是50%的性能差异。
关于优化的一个自然的想法是,在循环中调用cmp(elem, pivot),而不是用一些独立的elem & piovt或elem & pivot来测试。不幸的是,cmp不会提高速度;事实上它还有可能会降速,至少当data的元素是一些基本类型比如数字和字符串的时候,的确是这样。
那么,select的性能和下面这个简单方法的性能相比如何呢?def&selsor(data,&n): &&&&&&&data&=&list(data) &&&&&&&data.sort(&) &&&&&&&return&data[n]&
在我的计算机上,获取一个3 001个整数的充分洗牌的列表的中值,本节解决方案的代码耗时16ms,而selsor耗时13ms,再考虑到sort在序列部分有序的情况下速度会更快,元素是基本类型且比较操作执行得很快,而且列表长度也不大,所以使用select并没有什么优势。将长度增加到30 001,这两个方法的性能变得非常接近,都是约170ms。但当我将列表长度修改成300 001,select终于表现出了优势,它用了2.2s获得了中值,而selsor需要2.5s。
但如果序列中元素的比较操作非常耗时,那么这两个方式刚刚表现出的大致平衡就被彻底打破了,因为这两个方式的最关键的差异就是比较操作执行的次数-select执行O(n)次,而selsor执行O(nlogn)次。举个例子,假如我们需要比较的是某个类的实例,其比较操作的开销相当大(模拟某些四维的坐标点,其前三维坐标通常总是相同的):class&X(object): &&&&&&&def&_&_init_&_(self): &&&&&&&&&&&&&selfself.a&=&self.b&=&self.c&=&23.51 &&&&&&&&&&&&&self.d&=&random.random(&) &&&&&&&def&_dats(self): &&&&&&&&&&&&&return&self.a,&self.b,&self.c,&self.d &&&&&&&def&_&_cmp_&_(self,&oth): &&&&&&&&&&&&&return&cmp(self._dats,&oth._dats)&
现在,即使只对201个实例求中值,select就已经表现得比selsor快了。
换句话说,基于列表的sort方法的实现的确要简洁得多,实现select也确实需要多付出一点力气,但如果n足够大而且比较操作的开销也无法忽略的话,select就体现出它的价值了。
Library Reference和Python in a Nutshell文档中关于list类型的sort方法,以及random模块。
【责任编辑: TEL:(010)】&&&&&&
关于&&&&的更多文章
本书介绍了Python应用在各个领域中的一些使用技巧和方法,其主题
本书描述了黑客用默默无闻的行动为数字世界照亮了一条道路的故事。
讲师: 9人学习过讲师: 28人学习过讲师: 18人学习过
迄今为止,软件故障直接或间接导致的事故已经造成了大
本书由以太网标准制定参与者、以太网配置方面的顶级专
在这本首次由内部人士讲述希格斯玻色子发现过程的书中
本书是AJAX之父的经典之作。本书用简洁的语言系统化地诠释了设计、技术和商业融合是最重要的发展趋势。全书共8章,包括关于用户
51CTO旗下网站日期:甲数=2&3&5&7,乙数=2&3&11,甲乙两数的最大公因数是(),最小公倍数是()
9. 一个数,正好能被2、3、5整除,这个数最小是()。
10. 若,A=2&5,B=2&7,则A和B的最小公倍数是()。
11. 直接写出下面每组数的最小公倍数:
(1)5和6的最小公倍数是()。
(2)5和10的最小公倍数是()。
(3)2、3和5的最小公倍数是()。
(4)4、16和8的最小公倍数是()。
二、判断(对的打&&&,错的打&ldq...<b style="color:#aa的最小公倍数是的相关内容日期:最大公约数和最小公倍数&练习题& 1.有一级茶叶96克,二级茶叶156克,三级茶叶240克,价值相等.现将这三种茶叶分别等分装袋(均为整数克),每袋价值相等,要...日期:最大公约数和最小公倍数 如果数a能被数b整除,a就叫做b的倍数,b就叫做作a的约数.约数和倍数都表示一个数与另一个数的关系,不能单独存在.如只能说16是某数的倍数,2是某数的约数,而不能孤立地说16是倍数,2是约数. 倍 与 倍数 是不同的两个概念, 倍 是指两个数相除的日期:最大公约数和最小公倍数的比较 bgcolor= #FFFFFF > 教学目标 (一)进一步理解并掌握最大公约数和最小公倍数的概念,分清求最大公约数和最小公倍数的相同点和不同点。 (二)培养学生仔细、认真的做题习惯和比较的思维方法。 (三)培养学生观察、分析、比较的能力。 教学重点和难日期:最小公倍数 bgcolor= #FFFFFF > 教学目标 (一)认识公倍数和最小公倍数。 (二)理解求两个数的最小公倍数的算理,掌握方法。 (三)通过教学,培养学生的比较推理和抽象概括的能力。 教学重点和难点 (一)几个数的公倍数和最小公倍数的概念。 (二)理解求最小公倍数的算理、掌握计日期:最大公约数、最小公倍数的比较 教学目标 1.进一步巩固最大公约数和最小公倍数的计算方法. 2.掌握求两个数最大公约数和最小公倍数的相同点与不同点. 教学重点 比较求两个数的最大公约数和最小公倍数的相同点和不同点. ...日期:五年级奥数专题十二:最大公约数与最小公倍数(1) 如果一个自然数a能被自然数b整除,那么称a为b的倍数,b为a的约数。 如果一个自然数同时是若干个自然数的约数,那么称这个自然数是这若干个自然数的公约数。在所有公约数中最大的一个公约数,称为这若干个自然数的最大公约数日期:五年级奥数专题十三:最大公约数与最小公倍数(2) 这一讲主要讲最大公约数与最小公倍数的关系,并对最大公约数与最小公倍数的概念加以推广。 在求18与12的最大公约数与最小公倍数时,由短除法 可知,(18,12)=2&3=6,[18,12]=2&3&3&2=36。如果把
&最新内容- - - - - - - - - - - -
&&热点推荐
精品专题-  -  - -  -  - -  -  - -  -  - -  -  - -  -  - -  -  - -  -  - -  -  -
英语学习- -  -  - -  -  - -  -  - - -  -  - -  -  - -  -  - - -  -  -
数学学习-  - - -
 - - - - - - - -君,已阅读到文档的结尾了呢~~
微观经济学&#40;第五版&#41;6&#x2d;10章课后答案610,? &#40;,610)
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
微观经济学&#40;第五版&#41;6-10章课后答案
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口用8、2、5这三个数字组成没有重复数字的两位数,可以写几个?在表内写一写.其中最大是几?最小是几?
82,85,28,25,58,52,共6个.
2、5;8、5;8、2
最大是85,最小是25.答:可以写6个,最大是85,最小是25.
为您推荐:
扫描下载二维码根据5.3×2=10.6×1,写出比值最小的比例是( ),比值最大的比例是( )
最小的比例是(1:5.3=2:10.6 ),比值最大的比例是( 10.6:2=5.3:1)
为您推荐:
其他类似问题
扫描下载二维码}

我要回帖

更多关于 4和10的最小公倍数 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信