版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Ch05 系列数据类型本章要点:5.1 数据结构基础5.2 常用的数据结构5.3 Python系列数据概述5.4 系列数据的基本操作5.5 列表5.6 元组5.7 集合5.8 字典(映射)5.9 算法基础5.10 常用的查找和排序算法5.11 应用举例Ch05 系列数据类型本章要点:5.1 数据结构基础著名的计算机科学家尼克劳斯沃思(Nikiklaus Wirth)指出:程序=算法+数据结构算法是执行特定任务的方法数据结构是一种存储数据的方式,有助于求解特定的问题数据(Data)是能够被计算机处理的对象集合。数据由数据元素(Date Element)组成,数据元素包含数据项(Data Item
2、)在学生档案管理系统中,每位学生信息是数据的基本单位,称之为数据元素,也称为元素(Element)、节点(Node)或者记录(Record)组成数据元素的项称之为数据项,数据项是数据的最小标识单位,又称为字段(Field)或者域(Field)例如,学生信息由学号、姓名、性别、出生年月、专业等组成5.1 数据结构基础著名的计算机科学家尼克劳斯沃思(Nik数据结构数据结构通常由三个部分组成:数据的逻辑结构,数据的存储结构和数据的运算结构(1)数据的逻辑结构数据的逻辑结构反映数据元素之间的逻辑关系。数据的逻辑结构主要包括线性结构(一对一的关系)、树形结构(一对多的关系)、图形结构(多对多的关系)、集
3、合等(2)数据的物理结构数据的物理结构反映数据的逻辑结构在计算机存储空间的存放形式,即数据结构在计算机中的表示。其具体的实现方法包括顺序、链接、索引、散列等多种形式。一种数据结构可以由一种或者多种物理存储结构实现(3)数据的运算结构数据的运算结构反映在数据的逻辑结构上定义的操作算法,例如检索、插入、删除、更新和排序等数据结构数据结构通常由三个部分组成:数据的逻辑结构,数据的存数据的逻辑结构(1)反映数据元素之间的逻辑关系,与他们在计算机中的存储位置无关数据结构可以表示为DS=(D, R),其中DS表示数据结构,D表示数据集合,R表示关系(Relation)集合三口之家的成员的数据逻辑结构可以表
4、示如下:DS=(D, R)D=父亲, 母亲, 孩子R=(父亲, 母亲), (父亲, 孩子), (母亲, 孩子)数据的逻辑结构可以分为线性结构和非线性结构线性结构中的元素节点具有线性关系。如果从数据结构的语言来描述,线性结构具有以下特点。(1)线性结构是非空集。(2)线性结构有且仅有一个开始节点和一个终端节点。(3)线性结构所有节点都最多只有一个直接前趋节点和一个直接后继节点线性表、队列、栈等数据结构属于线性结构数据的逻辑结构(1)反映数据元素之间的逻辑关系,与他们在计算数据的逻辑结构(2)非线性结构中的各元素节点之间具有多个对应关系。如果从数据结构的语言来描述,非线性结构具有以下特点。 (1)
5、非线性结构是非空集。(2)非线性结构的一个节点可能有多个直接前趋节点和多个直接后继节点。在实际应用中,数组、广义表、树结构和图结构等数据结构属于非线性结构常用的数据逻辑结构包括如下几种方式,如图所示。(1)集合:数据结构中的元素之间除了“同属一个集合”的相互关系外,别无其他关系。(2)线性结构:数据结构中的元素存在一对一的相互关系。(3)树形结构:数据结构中的元素存在一对多的相互关系。(4)图形结构:数据结构中的元素存在多对多的相互关系数据的逻辑结构(2)非线性结构中的各元素节点之间具有多个对应数据的物理结构数据的物理结构是指逻辑结构在计算机存储空间的存放形式。数据的物理结构是数据结构在计算机
6、中的实现方式,它包括数据元素的机内表示和关系的机内表示实现逻辑数据结构的常用方法包括顺序、链接、索引、散列等。一种逻辑数据结构可以表示成一种或者多种物理存储结构数据元素之间的关系在计算机内部的存储结构通常有两种方式:顺序存储结构和链式存储结构顺序映像借助元素在存储器中的相对位置来表示数据元素之间的逻辑关系非顺序映像借助指示元素存储位置的指针来表示数据元素之间的逻辑关系数据的物理结构数据的物理结构是指逻辑结构在计算机存储空间的存常用算法数据的算法基于数据的逻辑结构,但具体实现要在物理存储结构上进行基于数据结构的常用算法包括以下几种。(1)检索:在数据结构中查找满足给定条件的节点。(2)插入:在数
7、据结构中增加新的节点。(3)删除:从数据结构中删除指定节点。(4)更新:改变指定节点的一个或者多个字段的值。(5)排序:按某种指定的顺序重新排列节点(从而可以提高其他算法的操作效率)常用算法数据的算法基于数据的逻辑结构,但具体实现要在物理存储5.2 常用的数据结构5.2.1 线性表5.2.2 队列5.2.3 栈5.2.4 树5.2.5 图5.2.6 堆5.2.7 散列表5.2 常用的数据结构5.2.1 线性表线性表线性表(Linear List)是最基本的一种数据结构,是具有相同特性的数据元素的有限序列,通常记做(a1,a2,an)。其中a1无前趋,an无后继,其他每个元素都有一个前趋和后继线
8、性表的物理存储结构主要有两种:顺序存储结构和链式存储结构,前者称为顺序表,后者称为线性链表顺序存储结构使用一组地址连续的存储单元依次存储线性表的数据元素顺序表的优点是查找和访问元素速度快,但插入和删除开销大链表(Linked List)是一种数据元素按照链式存储结构进行存储的数据结构,这种存储结构具有在物理上存在非连续的特点链表由一系列数据节点构成,每个数据节点包括数据域和指针域两部分线性链表的优点在于插入和删除效率高。其缺点是访问元素时需要遍历链表的所有元素,因而效率欠佳线性表线性表(Linear List)是最基本的一种数据结构队列和栈队列(Queue)是先进先出的系列(FIFO,Firs
9、t In First Out),即最先添加的元素,是最先弹出的元素列表可以实现队列,但并不适合。因为从列表的头部移除一个元素,列表中的所有元素都需要移动位置,所以效率不高。用户可以使用collections模块中的deque对象来删除列表头部的元素栈(Stack)是后进先出的队列(LIFO,Last In First Out),即最后添加(push)的元素,是最先弹出(pop)的元素向列表最后位置添加元素和从最后位置移除元素非常方便和高效,故使用列表可以快捷高效地实现栈list.append()方法对应于入栈操作(push);list.pop()对应于出栈操作(pop)队列和栈队列(Queue
10、)是先进先出的系列(FIFO,Fir树(1)树(Tree)是典型的非线性结构,由n(n=1)个有限节点组成一个具有层次关系的集合,其形状像一棵倒挂的树树具有以下的特点。(1)每个节点有零个或多个子节点。(2)没有父节点的节点称为根节点(root)。(3)每一个非根节点有且只有一个父节点。(4)除了根节点外,每个子节点可以分为多个不相交的子树树的常用术语(1)(1)节点:每个元素称为节点。(2)根节点:没有父节点的节点称为根节点。(3)节点的度(degree):一个节点含有的子节点个数称为该节点的度。(4)叶节点或终端节点(leaf):度为0的节点称为叶节点。(5)非终端节点或分支节点(bran
11、ch):度不为0的节点。树(1)树(Tree)是典型的非线性结构,由n(n=1)个树(2)树的常用术语(2)(6)双亲节点或父节点(parent):若一个节点含有子节点,则这个节点称为其子节点的父节点。(7)孩子节点或子节点(child):一个节点含有的子树的根节点称为该节点的子节点。(8)兄弟节点(sibling):具有相同父节点的节点互称为兄弟节点。(9)树的度:一棵树中,最大的节点的度称为树的度。(10)节点的层次(level):从根开始定义起,根为第1层,根的子节点为第2层,以此类推(11)树的高度或深度(depth):树中节点的最大层次。(12)堂兄弟节点:双亲在同一层的节点互为堂兄
12、弟节点。(13)节点的祖先:从根到该节点所经分支上的所有节点。(14)子孙:以某节点为根的子树中任一节点都称为该节点的子孙。(15)森林:m(m=0)棵互不相交的树的集合称为森林。树(2)树的常用术语(2)树(3)树的常用术语(3)(16)空树。空集合也是树,称为空树。空树中没有节点。(17)无序树:树中任意节点的子结点之间没有顺序关系,这种树称为无序树,也称为自由树。(18)有序树:树中任意节点的子结点之间有顺序关系,这种树称为有序树。(19)二叉树:每个节点最多含有两个子树的树称为二叉树。(20)满二叉树:如果一棵二叉树只有度为0的结点和度为2的结点,并且度为0的结点在同一层上,则这棵二叉
13、树为满二叉树。即,一棵深度为k且有2k-1个结点的二叉树称为满二叉树。满二叉树每一层的结点个数都达到了最大值,即满二叉树的第i层上有2i-1个结点。如图5-6(a)所示是一棵深度为3的满二叉树(21)完全二叉树:满二叉树中叶子节点所在的层次中,如果自右向左连续缺少若干叶子节点,这样的得到的二叉树被称为完全二叉树。即,若设二叉树的深度为k,除第k层外,其它各层(1k-1)的节点数都达到最大个数,而第k层所有的节点都连续集中在最左边,这就是一个完全二叉树。如图5-6(b)所示是一棵完全二叉树。如图5-6(c)所示是一棵非完全二叉树。满二叉树是完全二叉树的特殊形态。(22)哈夫曼树(最优二叉树):带
14、权路径最短的二叉树称为哈夫曼树或最优二叉树树(3)树的常用术语(3)二叉树重要性质二叉树重要性质二叉树的遍历(1)二叉树是n个有限元素的集合,该集合或者为空、或者由一个称为根的元素及两个不相交的、被分别称为左子树和右子树的二叉树组成二叉树具有五种基本形态遍历二叉树,就是按一定的规则和顺序遍历二叉树的所有节点,使每一个节点都被访问一次,而且只被访问一次在任一给定节点上,可以按某种次序执行三个操作。(1)访问节点本身(N)。(2)遍历该节点的左子树(L)。(3)遍历该节点的右子树(R)以上三种操作有六种遍历方法:NLR、LNR、LRN、NRL、RNL、RLN二叉树的遍历(1)二叉树是n个有限元素的
15、集合,该集合或者为空二叉树的遍历(2)1、NLR:前序遍历(Preorder Traversal),又称为先序遍历。若二叉树非空,则依次执行如下操作。访问根结点(N)遍历左子树(L)遍历右子树(R)2、LNR:中序遍历(Inorder Traversal)。若二叉树非空,则依次执行如下操作。遍历左子树(L)访问根结点(N)遍历右子树(R)3、LRN:后序遍历(Postorder Traversal)。若二叉树非空,则依次执行如下操作。遍历左子树(L)遍历右子树(R)访问根结点(N)二叉树的遍历(2)1、NLR:前序遍历(Preorder T图、堆、散列表图(Graph)是另一种非线性数据结构。
16、图是由顶点集合V(Vertex)和边集合E(Edge)组成的,定义为G=(V,E)在图结构中,数据节点一般称为顶点,而边是顶点的有序偶对。如果两个顶点之间存在一条边,那么就表示这两个顶点具有相邻关系堆(Heap)是一种特殊的树形数据结构,其中子节点与父节点是一种有序关系散列表(Hash table,也叫哈希表)是把键值映射(映射函数)到表(散列表)的数据结构,通过键值可以实现快速查找图、堆、散列表图(Graph)是另一种非线性数据结构。图是由5.3 Python系列数据概述数组将数据存储在一个或多个数组中,通过索引下标访问并处理数组的元素Python内置的序列数据类型元组(tuple)、列表(
17、list)、字符串(str)和字节数据(bytes和bytearray)5.3 Python系列数据概述数组系列数据的基本操作(1)系列的长度、最大值、最小值、求和len()、max()、min(),获取系列的长度、系列中元素最大值、系列中元素最小值sum()获取列表或元组中各元素之和【例5.1】系列数据的求和示例 t1=(1,2,3,4) sum(t1) #输出:1010 t2=(1,a,2) sum(t2) #TypeError: unsupported operand type(s) for +: int and str s=1234 sum(s) #TypeError: unsuppo
18、rted operand type(s) for +: int and str系列数据的基本操作(1)系列的长度、最大值、最小值、求和系列数据的基本操作(2)【例5.2】系列的长度、最大值、最小值操作示例 s=abcdefg len(s)7 max(s)g min(s)a s2= len(s2)0 t=(10,2,3) len(t)3 max(t)10 min(t)2 t2=() len(t2)0 lst=1,2,9,5,4 len(lst)5 max(lst)9 min(lst)1 lst2= len(lst2)0 b=bABCD len(b)4 max(b)68 min(b)65 b2=b
19、 len(b2)0系列数据的基本操作(2)【例5.2】系列的长度、最大值、最小系列的索引访问操作【例5.3】系列的索引访问示例 s=abcdef s0a s2c s-1f s-3d t=(a,e,i,o,u) t0a t1e t-1u t-5a lst=1,2,3,4,5 lst01 lst1, 2, 3, 4, 5 lst2=a lst-2=b lst1, 2, a, b, 5 b=bABCDEF b065 b166 b-170 b-269系列的索引访问操作 s=abcdef t=(系列的切片操作【例5.4】系列的切片操作示例 s=abcdef s1:3bc s3:10def s8:2 s:
20、abcdef s:2ab s:2ace s:-1fedcba t=(a,e,i,o,u) t-2:-1(o,) t-2:(o, u) t-99:-5() t-99:-3(a, e) t:(a, e, i, o, u) t1:-1(e, i, o) t1:2(e, o) lst=1,2,3,4,5 lst:21, 2 lst:1= lst2, 3, 4, 5 lst:22, 3 lst:2=a lst1:=b lsta, b del lst:1 lstb b=bABCDEF b2:2b b0:1bA b1:2bB b2:2b b-1:bF b-2:-1bE b0:len(b)bABCDEF系列的
21、切片操作【例5.4】系列的切片操作示例 s=a系列的连接和重复操作【例5.5】系列的连接和重复操作示例 s1=abc s2=xyz s1+s2abcxyz s1*3abcabcabc s1 += s2 s1abcxyz s2 *= 2 s2xyzxyz t1=(1,2) t2=(a,b) t1+t2(1, 2, a, b) t1*2(1, 2, 1, 2) t1 += t2 t1(1, 2, a, b) t2 *= 2 t2(a, b, a, b) lst1=1,2 lst2=a,b lst1+ lst21, 2, a, b 2 * lst2a, b, a, b lst1 += lst2 ls
22、t11, 2, a, b lst2 *=2 lst2a, b, a, b b1=bABC b2=bXYZ b1+b2bABCXYZ b1*3bABCABCABC b1+=b2 b1bABCXYZ b2*=2 b2bXYZXYZ系列的连接和重复操作【例5.5】系列的连接和重复操作示例系列的成员关系操作【例5.6】系列中元素的存在性判断示例 s=Good, better, best! o in sTrue g not in sTrue s.count(e)3 s.index(e, 10)10 t=(r, g, b) r in tTrue y not in tTrue t.count(r)1 t.i
23、ndex(g)1 lst=1,2,3,2,1 1 in lstTrue 2 not in lstFalse lst.count(1)2 lst.index(3)2 b=bOh, Jesus! bO in bTrue bo not in bTrue b.count(bs)2 b.index(bs)6系列的成员关系操作 s=Good, better, 系列的比较运算操作【例5.7】系列的比较运算示例 s1=abc s2=abc s3=abcd s4=cba s1 s4False s2 s1 = s2True s1 != s3True a ATrue a = True t1=(1,2) t2=(1,
24、2) t3=(1,2,3) t4=(2,1) t1 t1 t1 = t3False t1 != t2False t1 = t3False t4 t3True s1=a,b s2=a,b s3=a,b,c s4=c,b,a s1 s1 s1=s2True s1!=s3True s1=s3False s4s3True b1=babc b2=babc b3=babcd b4=bABCD b1 b1 b1=b2True b1=b3False b3!=b4True b4b3False系列的比较运算操作【例5.7】系列的比较运算示例 s1系列的排序操作【例5.8】系列的排序操作示例 s1=axd sort
25、ed(s1)a, d, x s2=(1,4,2) sorted(s2)1, 2, 4 sorted(s2,reverse=True)4, 2, 1 s3=abAC sorted(s3, key=str.lower)a, A, b, C系列的排序操作【例5.8】系列的排序操作示例 s1=内置函数all()和any()all(iterable) #如果序列的所有值都为True,返回True;否则,返回Falseany(iterable) #如果序列的任意值为True,返回True;否则,返回False any(1, 2, 0)True all(1, 2, 0)False内置函数all()和any(
26、)all(iterable) 5.5 列表使用列表字面量可以创建列表实例对象。列表字面量列表采用方括号中用逗号分隔的项目定义【例5.9】使用列表字面量创建列表实例对象示例用户也可以通过创建list对象来创建列表【例5.10】使用list对象创建列表实例对象示例 list1=; list2=1; list3=a,b,c print(list1,list2,list3) #输出: 1 a, b, c list1=list(); list2=list(abc); list3=list(range(3) print(list1,list2,list3) #输出: a, b, c 0, 1, 25.5
27、列表使用列表字面量可以创建列表实例对象。列表字面量列列表的系列操作索引访问、切片操作、连接操作、重复操作、成员关系操作、比较运算操作,以及求列表长度、最大值、最小值等列表是可变对象【例5.11】列表的系列操作示例 s=1,2,3,4,5,6 s1=a s1, a, 3, 4, 5, 6 s2= s1, a, , 4, 5, 6 del s3 s1, a, , 5, 6 s:21, a s2:3= s1, a, 5, 6 s:1= sa, 5, 6 s:2=b sb, 6 del s:1 s6列表的系列操作索引访问、切片操作、连接操作、重复操作、成员关列表对象的方法列表对象的方法列表解析表达式使
28、用列表解析可以简单高效地处理一个可迭代对象,并生成结果列表。列表解析表达式的形式如下【例5.12】列表解析表达式示例 i*2 for i in range(10) #平方值0, 1, 4, 9, 16, 25, 36, 49, 64, 81 (i,i*2) for i in range(10) #序号, 平方值(0, 0), (1, 1), (2, 4), (3, 9), (4, 16), (5, 25), (6, 36), (7, 49), (8, 64), (9, 81) i for i in range(10) if i%2=0 #取偶数0, 2, 4, 6, 8 (x, y, x*y)
29、 for x in range(1, 4) for y in range(1, 4) if x=y #二重循环(1, 1, 1), (2, 1, 2), (2, 2, 4), (3, 1, 3), (3, 2, 6), (3, 3, 9)列表解析表达式使用列表解析可以简单高效地处理一个可迭代对象,列表的排序(1)内置数据类型list中的方法sort(),把列表中的数据项按升序重新排列。(2)内置函数sorted()则保持原列表不变,返回一个新的包含按升序排列的项的列表【例5.13】Python语言提供的排序算法示例 a = 59,12,77,64,72,69,46,89,31,9 sorted
30、(a) #输出:9, 12, 31, 46, 59, 64, 69, 72, 77, 89 a #输出:59, 12, 77, 64, 72, 69, 46, 89, 31, 9 a.sort(reverse=True) a #输出:89, 77, 72, 69, 64, 59, 46, 31, 12, 9列表的排序(1)内置数据类型list中的方法sort(),把元组一组有序系列,包含0个或多个对象引用元组的定义元组也可以通过创建tuple对象来创建【例5.14】使用tuple对象创建元组实例对象示例 t1=tuple() t2=tuple(abc) t3=tuple(1,2,3) t4=t
31、uple(range(3) print(t1,t2,t3,t4) #输出:() (a, b, c) (1, 2, 3) (0, 1, 2)元组一组有序系列,包含0个或多个对象引用 t1=tup元组的系列操作索引访问、切片操作、连接操作、重复操作、成员关系操作、比较运算操作,以及求元组长度、最大值、最小值等【例5.15】元组的系列操作示例 t1=(1,2,3,4,5,6,7,8,9,10) len(t1) #输出:10 max(t1) #输出:10 sum(t1) #输出:55元组的系列操作索引访问、切片操作、连接操作、重复操作、成员关集合集合数据类型是没有顺序的简单对象的聚集,且集合中元素不重
32、复Python集合数据类型包括可变集合对象(set)和不可变集合对象(frozenset)集合的定义表示空的dict,因为dict也使用花括号定义。空集为set()集合集合数据类型是没有顺序的简单对象的聚集,且集合中元素不重【例5.16】创建集合对象示例 1,2,11, 2 1,a,True1, a 1.2, TrueTrue, 1.2 set()set() frozenset()frozenset() set(Hello)H, e, o, l a,1,2Traceback (most recent call last): File , line 1, in a,1,2TypeError: u
33、nhashable type: list【例5.16】创建集合对象示例 1,2,1 集合的运算:并集、交集、差集和对称差集集合的运算:并集、交集、差集和对称差集【例5.17】集合的运算示例 s1=1,2,3 s2=2,3,4 s1 | s21, 2, 3, 4 s1 & s22, 3 s1 - s21 s1 s21, 4 s1.union(s2)1, 2, 3, 4 ersection(s2)2, 3 s1.difference(s2)1 s1.symmetric_difference(s2)1, 4【例5.17】集合的运算示例 s1=1,2,3可变集合的方法方法说明示例s1.update(s
34、2, .)s1 |= s2 | .并集s1= s1s2 s1.update(s2) #s1=1, 2, 3, 4ersection_update(s2, .)s1 &= s2 & .交集s1= s1s2 ersection_update(s2)# s1=2, 3s1.difference_update(s2, .)s1 -= s2 -.差集s1= s1s2 s1.difference_update(s2)# s1=1s1.symmetric_difference_update(s2)s1 = s2对称差集s1= s1s2s1.symmetric_difference_update(s2)# s
35、1=1, 4s.add(x)把对象x添加到集合ss1.add(a) # s1=1, 2, 3, as.remove(x)从集合s中移除对象x。若不存在,则导致KeyError s1.remove(1) #s1=2, 3s.discard(x)从集合s中移除对象x(如果存在的话) s1.discard(3) # s1=1, 2s.pop()从集合s随机弹出一个元素,如果s为空,则导致KeyError s1.pop() #输出:1。s1=2, 3s.clear()清空集合s s1.clear() # s1=set()可变集合的方法方法说明示例s1.update(s2, .字典(映射)字典(dict
36、,或映射map)是一组键/值对的数据结构。每个键对应于一个值。在字典中,键不能重复。根据键可以查询到值对象的哈希(hash)值【例5.18】对象的哈希(hash)值示例字典的键只能使用不可变的对象,但字典的值可以使用不可变或可变的对象 hash(100) #结果:100 hash(1.23) #结果:530343892119149569 hash(abc) #结果:901130859749610928字典(映射)字典(dict,或映射map)是一组键/值对的数字典的创建【例5.19】创建字典对象示例 a:apple,b:boya: apple, b: boy dict() dict(1:foo
37、d, 2:drink)1: food, 2: drink dict(id,1001),(name,Jenny)id: 1001, name: Jenny dict(baidu=, google=)baidu: , google: 字典的创建 dict(1:food,字典的访问操作【例5.20】字典的访问示例 d=1:food, 2:drink d1: food, 2: drink d1food d3=fruit d1: food, 2: drink, 3: fruit del d2 d1: food, 3: fruit d2Traceback (most recent call last):
38、File , line 1, in d2KeyError: 2字典的访问操作 d=1:food, 2:dri字典对象的方法假设表中的示例基于d=1: food, 2: drink, 3: fruit方法说明示例d.clear()删除所有元素 d.clear();d #结果:d.copy()浅拷贝字典 d1=d.copy(); id(d), id(d1)(2487537820800, 2487537277976)d.get(k)返回键k对应的值,如果key不存在,返回None d.get(1),d.get(5)(food, None)d.get(k, v)返回键k对应的值,如果key不存在,返回
39、v d.get(1,无),d.get(5,无)(food, 无)d.pop(k)如果键k存在,返回其值,并删除该项目;否则导致KeyError d.pop(1), d(food, 2: drink, 3: fruit)d.pop(k, v)如果键k存在,返回其值,并删除该项目;否则返回v d.pop(5,无), d(无, 1: food, 2: drink, 3: fruit)d.setdefault(k, v)如果键k存在,返回其值;否则添加项目k= v,v默认为None d.setdefault(1) #结果:food d.setdefault(4);d1: food, 2: drink,
40、 3: fruit, 4: Noned.update(other)使用字典或键值对,更新或添加项目到字典d d1=1: 食物, 4: 书籍 d.update(d1);d1: 食物, 2: drink, 3: fruit, 4: 书籍字典对象的方法假设表中的示例基于d=1: food, 5.9 算法基础算法是指解决问题的一种方法或一个过程。算法通常使用计算机程序来实现算法的实现为若干指令的有穷序列,具有如下性质。(1)输入数据。算法可以接收用于处理的外部数据。(2)输出结果。算法可以产生输出结果。(3)确定性。算法的组成指令必须是准确无歧义。(4)有限性。算法指令的执行次数必须是有限的,执行的时
41、间也必须是有限的算法的性能分析包括时间性能分析和空间性能分析两个方面算法的时间性能分析,又称之为算法的时间复杂度(Time Complexity)分析问题的规模(Size)即算法求解问题的输入量一个算法运行的总时间取决于以下两个主要因素。(1)每条语句的执行时间成本。(2)每条语句的执行次数(频度)即一个算法所耗费的时间等于算法中每条语句的执行时间之和5.9 算法基础算法是指解决问题的一种方法或一个过程。算法通【例5.21】算法中语句的频度之和(frequency.py)total = 0for i in range(n): for j in range(n): total += aijpri
42、nt(total)循环语句运行了n*n次,总算法执行语句频度为n2+2【例5.21】算法中语句的频度之和(frequency.py增长量级增长量级用于描述函数的渐进增长行为,一般使用大O符号表示。例如,2n、100n与n+1属于相同的增长量级,记为O(n),表示函数随n线性增长增长量级增长量级用于描述函数的渐进增长行为,一般使用大O符号算法的空间复杂度分析Python语言面向对象特性的主要代价之一是内存消耗。Python的内存消耗与其在不同计算机上的实现有关。不同版本的Python有可能使用不同方法实现同一种数据类型确定一个Python程序内存使用的典型方法是,先统计程序所使用对象的数量,然后
43、根据对象的类型乘以各对象占用的字节数使用函数sys.getsizeof(x),可以返回一个内置数据类型x在系统中所占用的字节数【例5.22】Python语言中对象占用内存大小示例 import sys sys.getsizeof(100) #整数对象占用内存大小。输出:28 sys.getsizeof(1.23) #字符串对象占用内存大小。输出:53 sys.getsizeof(True) #布尔逻辑型对象占用内存大小。输出:28算法的空间复杂度分析Python语言面向对象特性的主要代价之5.10 常用的查找和排序算法5.10.1 顺序查找法5.10.2 二分查找法5.10.3 冒泡排序法5.
44、10.4 选择排序法5.10.5 插入排序法5.10.6 归并排序法5.10.7 快速排序法5.10 常用的查找和排序算法5.10.1 顺序查找法顺序查找法假定要从n个元素中查找x的值是否存在,最原始的办法是从头到尾逐个查找,这种查找方法称为顺序查找法算法的时间复杂度为O(n):最好的情况下,第一个项就是我们要找的数据对象,只有一次比较;最差的情况下,需要n次比较,全部比较完之后查不到数据;平均情况下,比较次数为n/2次【例5.23】在列表中顺序查找特定数值x(sequentialSearch.py)to be continued顺序查找法假定要从n个元素中查找x的值是否存在,最原始的办法【例
45、5.23】在列表中顺序查找特定数值x(sequentialSearch.py)def sequentialSearch(alist, item): #顺序查找法 pos = 0 #初始查找位置 found = False #未找到数据对象 while pos len(alist) and not found: #列表未结束并且还未找到则一直循环 if alistpos = item: #找到匹配对象,返回True found = True else: #否则查找位置+1 pos = pos+1 return founddef main(): testlist = 1, 3, 33, 8, 37
46、, 29, 32, 15, 5 #测试数据列表 print(sequentialSearch(testlist, 3) #查找数据3 print(sequentialSearch(testlist, 13) #查找数据13if _name_=_main_: main()【例5.23】在列表中顺序查找特定数值x(sequentia二分查找法二分查找法又称折半查找法,用于预排序列表的查找问题要在排序列表a中查找元素t,首先,将列表alist中间位置的项与查找关键字t比较,如果两者相等,则查找成功;否则利用中间项将列表分成前、后两个子表,如果中间位置项目大于t,则进一步查找前一子表,否则进一步查找后
47、一子表。重复以上过程,直到找到满足条件的记录,即查找成功;或直到子表不存在为止,即查找不成功对于包含N个元素的表,其时间复杂度为O(log2N)【例5.24】二分查找法的递归实现(binarySearch.py) to be continued二分查找法二分查找法又称折半查找法,用于预排序列表的查找问题【例5.24】二分查找法的递归实现def _binarySearch(key, a, lo, hi): if hi key: #中间位置项目大于查找关键字 return _binarySearch(key, a, lo, mid) #递归查找前一子表 elif amid A1,则A0与A1交换;
48、然后A1与A2比较,若A1A2,则A1与A2交换;直至最后AN-2与AN-1比较,若AN-2AN-1,则AN-2与AN-1交换。第一轮比较完成后,列表元素中最大的数“沉”到列表最后,而那些较小的数如同气泡一样上浮一个位置,顾名思义“冒泡法”排序。(2)第2轮比较:从第一个元素开始,对列表中前N-1个元素(第N个元素,即AN-1已经最大,无需参加排序)继续两两大小比较,如果不满足升序关系,则交换。第二轮比较完成后,列表元素中次大的数“沉”到最后,即AN-2为列表元素中次大的数。(3)以此类推,进行第N-1轮比较后,列表中所有元素均按递增顺序排好序。冒泡排序法对于包含N个元素的列表A,按递增顺序排
49、序的冒泡法的【例5.25】冒泡排序算法的实现(bubbleSort.py)def bubbleSort(a): for i in range(len(a)-1,-1,-1): #外循环 for j in range(i): #内循环 if aj aj + 1: #大数往下沉 aj, aj + 1 = aj + 1, aj #print(a) #跟踪调试def main(): a = 2,97,86,64,50,80,3,71,8,76 bubbleSort(a) print(a)if _name_ = _main_: main()【例5.25】冒泡排序算法的实现(bubbleSort.py选择
50、排序法对于包含N个元素的列表A,按递增顺序排序的选择法的基本思想是:每次在若干无序数据中查找最小数,并放在无序数据中的首位。其算法如下:(1)从N个元素的列表中找最小值及其下标,最小值与列表的第1个元素交换。(2)从列表的第2个元素开始的N-1个元素中再找最小值及其下标,该最小值(即整个列表元素的次小值)与列表第2个元素交换。(3)以此类推,进行第N-1轮选择和交换后,列表中所有元素均按递增顺序排好序。选择排序法对于包含N个元素的列表A,按递增顺序排序的选择法的【例5.26】选择排序算法的实现(selectionSort.py)def selectionSort(a): for i in ra
51、nge(0, len(a): #外循环(0N-1) m = i #当前位置下标 for j in range(i + 1, len(a): #内循环 if aj A1,则交换位置,结果左侧2个元素排序完毕。(2)第3个元素依次与其左侧的列表的元素比较,直至插入对应的排序位置,结果左侧的3个元素排序完毕。(3)以此类推,进行第N-1轮比较和交换后,列表中所有元素均按递增顺序排好序。插入排序法对于包含N个元素的列表A,按递增顺序排序的插入排序【例5.27】插入排序算法的实现(insertSort.py)def insertSort(a): for i in range(1, len(a): #外循
52、环(1N-1) j = i while (j 0) and (aj aj-1): #内循环 aj, aj-1 = aj-1, aj #元素交换 j -= 1 #继续循环 #print(a) #跟踪调试def main(): a = 59,12,77,64,72,69,46,89,31,9 insertSort(a) print(a)if _name_ = _main_: main()【例5.27】插入排序算法的实现(insertSort.py归并排序法归并排序法基于分而治之(Divide and Conquer)的思想。算法的操作步骤如下。(1)将包含N个元素的列表分成两个含N/2元素的子列表
53、。(2)对两个子列表递归调用归并排序(最后可以将整个列表分解成N个子列表)。(2)合并两个已排序好的子列表。归并排序法归并排序法基于分而治之(Divide and Co【例5.28】归并排序算法的实现(mergeSort.py)def merge(left, right): #合并两个列表 merged = i, j = 0, 0 #i和j分别作为left和right的下标 left_len, right_len = len(left), len(right) #获取左右子列表长度 while i left_len and j right_len: #循环归并左右子列表元素 if lefti
54、= rightj: merged.append(lefti) #归并左子列表元素 i += 1 else: merged.append(rightj) #归并右子列表元素 j += 1 merged.extend(lefti:) #归并左子列表剩余元素 merged.extend(rightj:) #归并右子列表剩余元素 #print(left,right,merged) #跟踪调试 return merged #返回归并好的列表def mergeSort(a): #归并排序 if len(a) = j: #如果下界大于等于上界,返回结果列表a return a key = ai #设置列表的
55、第1个元素作为关键数据 #print(key) #跟踪调试 while i j: #循环直到i=j while i = key: #j开始向前搜索,找到第一个小于key的值aj j = j-1 ai = aj while i j and ai = key: #i开始向后搜索,找到第一个大于key的ai i = i+1 aj = ai ai = key #ai等于关键数据 #print(a) #跟踪调试 quickSort(a, low, i-1) #递归调用快速排序算法(列表下界为low,上界为i-1) quickSort(a, j+1, high) #递归调用快速排序算法(列表下界为j+1,
56、上界为high)def main(): a = 59,12,77,64,72,69,46,89,31,9 quickSort(a, 0, len(a)-1) print(a)if _name_ = _main_: main()【例5.29】快速排序算法的实现(quickSort.py)5.11 应用举例基于列表的简易花名册管理系统:通过列表可以很方便实现一个花名册管理系统,实现名字的显示、查询、增加、删除、修改等功能【例5.30】简易花名册管理系统(name_list.py)(1)def menu(): #显示菜单 print(=*35) print(“简易花名册程序) print(1.显示名
57、字) print(2.添加名字) print(3.删除名字) print(4.修改名字) print(5.查询名字) print(6.退出系统) print(=*35)names = # 创建存储花名册的列表对象while True: # 重复执行 menu() #显示菜单 num = input(请输入选择的功能序号(1到6):) #获取用户输入 # 根据用户选择,执行相应的功能 if num = 1: print(names) elif num = 2: name = input(请输入要添加的名字:) names.append(name) print(names) elif num =
58、3: name = input(请输入要删除的名字:) if name in names: names.remove(name)5.11 应用举例基于列表的简易花名册管理系统:通过列表可以【例5.30】简易花名册管理系统(name_list.py)(2) else: print(系统中不存在名字:.format(name) print(names) elif num = 4: name = input(请输入要修改的名字:) if name in names: index = names.index(name) new_name = input(请输入修改后的名字:) namesindex = new_name else: print(系统中不存在
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年亲子园所特许经营协议
- 二零二五版环保管家技术服务合同样本:企业环保审计服务3篇
- 2025年度临床试验知识产权合同主体权益保护措施4篇
- 二零二五年度退休人员劳动解除合同及退休金领取及后续保障合同
- 2025年度临时工岗位临时性加班合同
- 2025年度电影演员演出合同书:科幻灾难片主演合约
- 2025年度门窗安装与智能化系统集成合同4篇
- 2025年度城市综合体门头租赁管理服务协议
- 二零二五年度C型钢智能化生产系统建设合同3篇
- 二零二五年度锂电池回收利用项目投资合作协议
- 二年级数学上册100道口算题大全 (每日一套共26套)
- 物流无人机垂直起降场选址与建设规范
- 肺炎临床路径
- 外科手术铺巾顺序
- 创新者的窘境读书课件
- 如何克服高中生的社交恐惧症
- 聚焦任务的学习设计作业改革新视角
- 移动商务内容运营(吴洪贵)任务三 APP的品牌建立与价值提供
- 电子竞技范文10篇
- 食堂服务质量控制方案与保障措施
- VI设计辅助图形设计(2022版)
评论
0/150
提交评论