您现在的位置是:生活百科网 > 生活百科 >
list排序(list排序方法根据某个字段排序)
2022-05-07 11:15生活百科 人已围观
简介3.3.1最小值搜索Python的min函数将会返回列表里的最小值或最小元素。为了研究这个算法的复杂度,我们将会开发一个替代版本,使之返回最小元素的索引(index)。这个算法假定列表不为...
3.3.1 最小值搜索
Python的min函数将会返回列表里的最小值或最小元素。为了研究这个算法的复杂度,我们将会开发一个替代版本,使之返回最小元素的索引(index)。这个算法假定列表不为空,并且元素是按照任意顺序存放在列表里的。它首先把第一个位置作为存放最小元素的位置;然后向右侧搜索更小的元素,如果找到,那么把最小元素的位置重置为当前位置;当算法到达列表末尾时,它将返回最小元素的位置。如下所示为函数indexOfMin里实现这个算法的代码。
的列表进行

次比较,也就是说,它的复杂度为

。
3.3.2 顺序搜索列表
Python的in运算符在list类里被实现为叫作__contains__的方法,这个方法会在任意的元素列表里搜索特定的元素,即目标元素(target item)。在这个列表里,找到目标元素的唯一方法是从位于第一个位置的元素开始,并把它和目标元素进行比较。如果两个元素相等,那么这个方法返回True;否则,这个方法将移动到下一个位置,并把它和目标元素进行比较。如果这个方法到了最后一个位置仍然找不到目标,那么返回False。这种搜索称为顺序搜索(sequential search)或线性搜索(linear search)。好用的顺序搜索函数会在找到目标时返回元素的索引,否则返回?1。下面是顺序搜索函数的Python实现。
3.3.3 最好情况、最坏情况以及平均情况下的性能
有些算法的性能取决于需要处理的数据所在的位置。若顺序搜索算法在列表开头就找到目标元素,那么这时的工作量明显会比在列表末尾找到的工作量要少。对于这类算法,我们可以确定最好情况下的性能、最坏情况下的性能以及平均性能。一般来说,你应该把重点放在平均情况和最坏情况下的性能,而不用过于关心最好情况。
对顺序搜索的分析需要考虑下面3种情况。
在最坏情况下,目标元素位于列表的末尾或者根本就不在列表里。这时,这个算法就必须访问每一个元素,对大小为的列表需要执行次迭代。因此,顺序搜索的最坏情况的复杂度为。
在最好情况下,只需要O(1)的复杂度,因为这个算法在一次迭代之后就会在第一个位置找到目标元素。
要确定平均情况,就需要把每个可能位置找到目标所需要的迭代次数相加,然后再将它们的总和除以。因此,这个算法会执行 ( + ?1 + ?2+…+1)/或( + 1)/2次迭代。对于非常大的来说,常数系数2是可以忽略的,因此,平均情况的复杂度仍然是。
显然,最好情况下顺序搜索的性能和其他两种情况比起来小很多,而其他两种情况下的性能是差不多的。
3.3.4 基于有序列表的二分搜索
对于没有按照任何特定顺序排列的数据来说,只能使用顺序搜索来找到目标元素。在数据有序的情况下,就可以使用二分搜索了。
下面是二分搜索函数的代码。

的列表来说,也就是你需要执行

/2/2…/2次,直到结果为1。假设

是这个

可以除以2的次数,那么求解

会有

,即

,于是

。因此,二分搜索在最坏情况下的复杂度为

。
图3-7展示了在包含9个元素的列表里,通过二分搜索查找并不在列表里的目标元素10时,对列表进行的分解。在图3-7中,与目标元素进行比较的元素会被加上阴影。可以看到,原始列表左半部分中的任何元素都不会被访问。
对目标元素10的二分搜索需要4次比较,而顺序搜索将会需要10次比较。当问题规模变得更大时,很明显这个算法会表现得更好。对于包含9个元素的列表来说,它最多需要进行4次比较,而对于包含1000000个元素的列表最多需要进行20次比较就能完成搜索!
二分搜索肯定要比顺序搜索更有效。但是,只能基于列表里数据的组织结构来选择合适的搜索算法类型。为了让列表能够有序,二分搜索需要付出额外的成本。稍后,我们会了解一些对列表进行排序的策略并分析它们的复杂度。现在,让我们来了解一些关于比较数据元素的细节。

图3-7 二分搜索10时所访问的列表元素
3.3.5 比较数据元素
def __lt__(self, other):如果self小于other,那么这个方法将返回True;否则,返回False。比较对象的标准取决于它们的内部结构以及所应该满足的顺序。
比如,SavingsAccount对象可能包含3个数据字段:名称、PIN(密码)以及余额。假定这个账户对象应该按照名称的字母顺序对它进行排序,那么就需要按照下面的方式来实现__lt__方法。
下面的代码将显示对若干个账户对象进行比较的结果。
本文摘自:数据结构 Python语言描述 第2版

本书用 Python 语言来讲解数据结构及实现方法。全书首先概述 Python 编程的功能—这些功能是实际编程和解决问题时所必需的;其次介绍抽象数据类型的规范、实现和应用,多项集类型,以及接口和实现之间的重要差异;随后介绍线性多项集、栈、队列和列表;最后介绍树、图等内容。本书附有大量的复习题和编程项目,旨在帮助读者巩固所学知识。
本书不仅适合高等院校计算机专业师生阅读,也适合对 Python 感兴趣的读者和程序员阅读。
上一篇:造轮子(造轮子是什么意思)
相关文章
- 2023北京本科普通批985院校投档线:清华685、北大683、武大653分
- 广东考生上华南理工大学难吗?
- 上海这3所大学2023考研复试分数线公布
- 最大相差178分!南京理工大学投档线集锦!最高681分,最低503分
- 2023湖北物理类投档线:武科大573、湖大563、江大536、武体506分
- 多少分能上南大?2023南京大学在苏录取数据盘点,这些途径可以走
- 2023山东高考,省内分数线最高的十所大学
- 国防科技大学录取分数线是多少?附国防科技大学毕业去向
- 郑州大学多少分能考上?2024才可以录取?附最低分数线
- 北京航空航天大学2023年录取分数线及省排名
- 哈尔滨工业大学(威海)、(深圳)校区2023年录取分数情况
- 2023广东本科投档线出炉!请看中大/华工/深大/华师/暨大等分数线
随机图文
浙江红色旅游景点大全(浙江红色旅游景点大全地图)
浙江红色旅游景点大全帝师,源于是1958年,至今已逾五十多年历史,帝师传承...
看,这两位画家笔下的秀水新韵
陈治良《墨润江南四屏》 ● ● ● ● ● ● ● ● ● ● ● ● ● 大写意中国画...
全国有多少苟金花(全国有多少苟金花人)
大家好,今天来为大家解答全国有多少苟金花这个问题的一些问题点,包括全国...
赛百味怎么搭配好吃(赛百味怎么搭配好吃日式照烧鸡)
「赛百味」减脂餐yyds,火了56年!定制版“N层爆馅面包”,好吃不胖!严选新...
山东冠县在家加工活(冠县零活加工)
聊城十四五期间着力构建“1+1+4”产业空间布局!1个主战场:聊茌东都市区(即...
土方虚方和实方换算 土方虚方和实方换算系数
大家好,今天来为大家分享土方虚方和实方换算的一些知识点,和土方虚方和实...
包河工业园(包河工业园招聘信息)
奇葩的营销!合肥街头惊现喝酒培训中心!日前,在合肥包河工业园一家夜市饭...
亲爱的我们都会错(亲爱的我们都会错有什么不能原谅呢)
我们的时间往前流什么歌虽然也不是潘玮柏的粉,但是还是有好几首歌曲会唱,...