补记录一下之前考Python二级的一些相关理论记录
pdf文件下载
算法复杂度用来衡量算法的优劣,它包括算法的时间复杂度和算法的空间复杂度
设计算法时要考虑正确性、可读性、健壮性、高效率和低存储量
对数据对象的运算和操作:算术运算、逻辑运算、关系运算、数据传输
算法的时间复杂度:是指执行算法所需要的计算工作量,可以用算法所执行的基本运算次数度量【此种衡量效率方法有利于比较同一问题的几种算法的优劣】
算法的空间复杂度:是指执行算法所需要的内存空间。包括算法程序、输入的初始数据以及算法执行过程中需要的额外空间
算法的时间复杂度和空间复杂度相互独立
数据的基本单位是数据元素,最小单位是数据项
数据的存储结构是指数据的逻辑结构在计算机中的表示
逻辑结构指反映数据元素之间的逻辑关系的数据结构,数据结构是相互关联的数据元素的集合
数据是需要处理的数据元素的集合,一般来,这些数据元素具有一个共同的特征
结构就是关系,是集合各个数据元素之间存在的某种关系(或联系)。在数据处理领域中,通常把数据元素之间的关系用前/后件关系(直接前驱/直接后继关系)
数据结构分为数据的逻辑结构和数据的存储结构,数据的逻辑结构指反映数据元素之间的逻辑关系(前后件关系)的数据结构,数据的存储结构又称为数据的物理结构,是数据的逻辑结构在计算机存储空间中的存放方式
数据的逻辑结构的数学形式定义——数据结构是一个二元组
B=(D,R)
B:数据结构
D:数据元素的集合
R:D上元素关系的集合,反映了D中各元素之间的前后件关系
如果将军职看作数据结构:
B=(D,R)
D={连长,排长,班长,士兵}
R={(连长,排长),(排长,班长),(班长,士兵)}
一个数据结构除了用二元关系表示外,还可以用图形来表示。用中间标有元素值的方框表示的数据元素,一般称为数据节点,简称节点。对于每一个二元组,用一条有向线段从前件指向后件
节点基本概念
基本概念 | 含义 | 例子 |
---|---|---|
根节点 | 数据结构中,没有前件的节点 | 在军职图中,“连长”为根节点 |
终端节点(叶子节点) | 数据结构中,没有后件的节点 | 在图中,“士兵”是终端节点 |
内部节点 | 数据结构中,除了根节点和终端节点以外的节点 | 在图中,“排长”和“班长”为内部节点 |
线性表及其顺序存储结构
数据结构中,线性结构习惯称为线性表,线性表是最简单、也是最常用的一种数据结构。线性表是n(x>=0)个数据元素构成的有限序列,除了第一个元素外的每一个元素,有且只有一个前件;除了最后一个元素外,有且只有一个后件
线性表要么是空表,要么表示为(a,b,c,…,d,e,f,*),括号中的每一个都是线性表中的数据元素,也称为线性表中的一个节点,同一个线性表中的数据元素必定都具有相同的特性,即属于同一数据对象。数组、矩阵、向量等都是线性表
使用线性表存储数据的方式可以这样理解,即”把所有数据用一根线串起来,再存储到物理空间中“
通常,线性表可以采用顺序存储和链式存储两种存储结构,顺序存储是存储线性结构最简单的结构,具体做法是将线性表中的元素一个接一个的存储在相邻的存储区域中
顺序表具有一下两个基本特征
链表
线性链表的概念
线性列表是指线性表的链式存储结构,简称链表。这种链表每个节点只有一个指针域,又称为单链表
在线性列表中,第一个元素没有前件,因此指向链表中的第一个节点的指针,是一个特殊指针,称为这个链表的头指针;最后一个元素没有后件,因此,线性链表最后一个节点的指针域为空,用NULL或0表示
当线性链表指向第一个数据元素的头指针等于NULL或0时,该表称为空表
在某些应用中,对线性链表中的每个节点设置两个指针,一个指针域存放前件的地址,称为左指针;一个指针域存放后件的地址,称为右指针,这样的线性列表称为双向链表。在双向链表中,由与每个节点设置了两个指针,因此从某一个节点出发,可以很方便的找到其他任意一个节点
带链的栈
栈也可以采用链式存储结构表示,可以把栈组织成一个单链表,这种数据结构称为带链的栈
带链的队列
带链的队列就是用一个单链表来表示队列,队列中每一个元素对应链表中的一个节点
在单链表的第一个节点前增加一个表头节点,队头指针指向表头节点,最后一个节点的指针域的值有NULL改为指向表头节点,这样的链表称为循环链表。在循环链表中,所有节点的指针构成了一个环状链
在循环链表中,只要指出表中任何一个节点的位置,就可以从它出发访问到表中其他所有的节点。并且,由于表头节点是循环链表固有的节点,因此,即使表中没有数据元素的情况下,表中也至少有一个节点存在,从而使空表和非空表的运算统一
栈及其基本运算
栈是一种特殊的线性表,它所有的插入与删除都限定在表的同一端进行,允许插入和删除的一端称为栈顶,不允许插入和删除的一端称为栈底;如果栈中没有元素时,称为空栈
栈修改的原则为:先进后出,后进先出
通常使用指针top来指示栈顶的位置,用指针bottom来指向栈底,栈顶指针top反映了栈不断变化的状态
栈的基本运算有三种:入栈、退栈、读栈顶元素
栈和一般线性表的存储方式类似,通常也可以采用顺序存储和链式存储
队列及其基本运算
队列是指允许在一端进行插入,而在另一端进行删除的线性表。允许进行删除运算的一端称为队头(排头),允许进行插入运算的一端称为队尾。
与栈相反,队列又称为“先进先出”或“后进后出”的线性表
在实际应用中,队列的顺序存储结构一般采用循环队列的形式,循环队列就是将队列存储空间的最后一个位置绕道第一个位置,形成逻辑上的环状空间,供队列循环使用
在循环队列中,用队尾指针rear指向队列中的队尾元素,用队头指针front指向排头元素的前一个位置。因此,从队头指针front指向的后一个位置直到队尾指针rear指向的位置之间所有的元素均为队列中的元素
循环队列的初始状态为空,即front=rear=m
在循环队列中,当front=rear时,不能确定队列是满还是空。在实际使用循环队列时,通常会增加一个标志s来区分队列是满还是空。当s=0时表示队列空;当s=1且front=rear时表示队列满
循环队列就是将队列存储空间的最后一个位置绕到第一个位置,形成逻辑上的环状空间
即队头指针总是指向队尾指针的后一个位置
基本对立概念中的队列是直线队列,而直线队列最大的问题在于不能充分利用存储空间。因为在直线队列中,元素个数小于空间大小
相关计算
rear>front ;n=rear-front【n为元素个数】
rear=front ;s=1或者s=0【s=1即队慢满,s=0即队空】
树的基本概念
树是一种简单的非线性结构
树中的节点数等于树中所有节点的度之和再+1,“树”图中的节点数为9
二叉树及其基本性质
二叉树的特点:
完全二叉树是指除最后一层外,每一层上的节点数均达到最大值,在最后一层上只缺少右边的若干节点的二叉树
可知:满二叉树一点是完全二叉树,完全二叉树不一定是满二叉树
完全二叉树具有一下特点:
二叉树的存储结构
二叉树通常采用链式存储结构,用于存储二叉树中元素的存储节点由数据域和指针域两部分构成。由于每一个元素可以有两个后件,因此用于存储二叉树的存储节点的指针域有两个:一个用与指向该节点的左子节点,即左指针域;一个用于指向该节点的右子节点,即右指针域
由于二叉树的存储结构中每一个存储节点有两个指针域,因此二叉树的链式存储结构也称为二叉链表
满二叉树和完全二叉树可以按层次进行顺序存储
二叉树的遍历
二叉树的遍历是指不重复地访问二叉树的所有节点,在遍历二叉树的过程中,一般先遍历左子树,再遍历右子树。在先左后右的原则下,根据访问根节点的次序不同,可分为前序遍历、中序遍历、后序遍历
前序遍历
首先访问根节点,然后遍历左子树,最后遍历右子树
二叉树的前序遍历序列为:A B D H E I C F G
中序遍历
首先遍历左子树,然后访问根节点,最后遍历右子树
二叉树的中序遍历序列为:H D B E I A C F G
后序遍历
首先遍历左子树,然后遍历右子树,最后访问根节点
二叉树的后序遍历序列为:H D I E B G F C A
如果已知前序遍历和中序遍历可以唯一确定这棵二叉树;已知中序遍历和后序遍历也可以唯一确定这颗二叉树。但是已知一棵二叉树的前序遍历序列和后序遍历序列,不能唯一确定这棵二叉树
前序序列 后序序列 中序序列
示例:前序:ABDEGHCFIJ 中序:DBGEHACIFJ 后序:DGHEBIJFCA
根节点为:A
技巧1:根据中序序列可以看出根节点A的左侧为左子树,右侧为右子树,在前序和后序序列中,不管左子树节点顺序怎样,位置都是连续的
如:前:BDEGH 中:DBGEH 后:DGHE
技巧2:中序序列和后序序列访问的顺序都是先访问左子树,因此访问的第一个节点是一致的
如:都访问D
若二叉树的前序遍历序列与中序遍历序列相同,则二叉树的任意一个节点均不存在左子树
若二叉树的后序遍历序列与中序遍历序列相同,则二叉树中的任意一个节点均不存在右子树
性质:
顺序查找
基本思想:从线性表的第一个元素开始,逐个将线性表中的元素与被查元素进行比较在以下情况下,顺序查找是唯一的选择:
二分法查找
能使用二分法查找的线性表必须满足两个条件:
用顺序存储结构
线性表是有序表
此处的“有序”特指:元素按非递减顺序排列,即从小到大排列,但是允许相邻元素相等
将X与线性表的中间项比较过程如下:
交换类排序是借助数据元素的“交换”来进行排序的一种方法
冒泡排序
在数据元素的序列中,对于某个元素,如果其后存在一个元素小于它,则称之存在一个逆序。冒泡排序的基本思想就是通过两两相邻数据元素之间的比较和交换,不断的消去逆序,直到所有数据元素以非递减顺序排列为止
在最坏情况下:对长度为n的线性表排序,冒泡排序需要比价的次数为n(n-1)/2
快速排序
在待排序的n个元素中取一个元素K(通常取第一个元素),以元素K作为分隔标准,把所有小于元素K的数据元素都移到K前面,把所有大于元素K的数据元素都移到K后面。这样,以K为分界线,把线性表分割为两个子表,这称为一趟排序。然后,对K前后的两个子表分别重复上述过程,知道分割的子表的长度为1,此时线性表已经排序完成
在最坏情况下:需要进行n(n-1)/2次,实际的排序效率要比冒泡排序高的多
插入类排序是每次将一个待排序元素,按其元素值的大小插入前面已经排好序的子表中的适当位置,直到全部元素插入完成为止
简单插入排序
把n个代排序的元素看成一个有序表和一个无序表,开始时,有序表只包含一个元素,而无序表包含另一个n-1元素,每次取无序表中的第一个元素插入有序表的正确位置,使之成为增加一个新的有序表。插入元素时,插入位置及其后的记录依次向后移动。最后有序表的长度为n,而无序表为空,此时排序完成
在最坏的情况下,简单插入排序需要进行n(n-1)/2次
希尔排序
通过每一次从待排序序列中选取值最小的元素,然后把其顺序放在已排好序的有序子表的后面,直到全部序列满足排序要求
简单选择排序
先从所有n个待排序的数据元素中选择最小的元素,将该元素与第一个元素交换,再从剩下的n-1个元素中选取最小的元素和第2个元素交换,重复操作直到所有元素有序为止
简单选择排序在最坏的情况下:需要比较n(n-1)/2次
程序的质量主要受到程序设计的方法、技术以及风格等因素的影响。“清晰第一、效率第二”是当今主导的程序设计风格
要形成良好的程序设计风格,主要应注重和考虑一下因素:
程序设计方法的发展而言,主要经历了结构化程序设计和面向对象的程序设计两个阶段
结构化程序设计的原则
结构化程序设计的基本结构
结构化程序设计方法是使用“顺序结构”“选择结构”及“循环结构”3中基本结构就足以表达其他各种结构的程序设计方法。它们的共同特征是:严格地只有一个入口和一个出口
遵循结构化程序的设计原则,按此原则设计出的程序具有:
面向对象方法的优点:
对象
面向对象方法中的对象由两部分组成
对象的基本特点:
特点 | 描述 |
---|---|
标识唯一性 | 对象是看区分的,且由对象的本质来区分,而不是通过描述来区分 |
分类性 | 指可以将具有相同属性和操作的对象抽象成类 |
多态性 | 指同一个操作可以是不同对象的行为,不同对象执行同一操作可以产生不同的结果 |
封装性 | 从外面只能看到对象的外部特性,对象的内部对外是不可见的 |
模块独立性 | 由于完成对象功能所需的元素都被封装在对象内部,因此模块独立性好 |
类和实例
类是具有共同属性、共同方法的对象的集合,是关于对象的抽象描述,反映属于该对象类型的所有对象性质。一个具体对象则是其对类的一个实例
类是关于对象性质的描述,它同对象一样,包括一组数据属性和在数据上的一组合法操作
消息
消息传递是对象间通信的手段,一个对象通过向另一个对象发送消息来请求其服务
继承
在面向对象的程序设计中,类和类之间可以继承,一个子类可以直接继承其父类的全部描述(属性和操作),这些属性和操作在子类中不必定义。此外,子类还可以定义它自己的属性和操作
多态性
在面向对象的软件技术中,多态性是指子类对象可以像父类对象那样使用,同样的消息(如方法)既可以发送给父类对象也可以发送给子类对象
软件定义与软件特点
计算机软件是由程序、数据以及相关文档构成的完整集合,它与计算机硬件一起组成计算机系统。其中,程序和数据是机器可执行的,文档是机器不可执行的
软件具有一下特点:
软件的分类
计算机软件按功能分为系统软件、应用软件、支撑软件(工具软件)
系统软件是管理计算机资源,提高计算机的使用效率,为用户提供各种服务的软件,如操作系统、数据库管理系统、编译程序、汇编程序及网络软件等
应用软件是为了应用于特定领域开发的软件
支撑软件是介于系统软件和应用软件主键,协助用户开发软件的工具软件,其中包括帮助程序人员开发和维护软件产品的工具软件,也包括帮助管理人员控制开发进程和项目管理的工具软件
软件工程
软件工程是试图用工程、科学以及数学的原理和方法研制、维护计算机软件的有关技术和管理方法,是应用于计算机软件的定义、开发及维护的一整套方法、工具、文档、实践标准及工序。软件工程包含3个要素:方法、工具、过程
抽象、信息隐蔽、模块化、局部化、确定性、一致性、完备性以及可验性是软件工程的原则
软件过程
软件过程是把输入转换为输出的一组彼此相光的资源和活动。软件过程是为了获得高质量人家软件所需要完成的一系列任务的框架,它规定了完成各项任务的工作步骤。软件过程所进行的基本活动主要有软件规格说明、软件开发或软件设计与实现、软件确认、软件演进
软件生命周期
软件开发应遵循软件生命周期。软件生命周期分为3个时期,共8个阶段
软件生命周期各阶段的主要任务:
结构化分析方法的常用工具
结构化分析方法是使用数据流图、数据字典、结构化英语、判定表及判定树等工具,来建立一种新的,被称为结构化规格说明的目标文档
需求分析的结构化分析方法中常用的工具是数据流图
软件设计的基本概念
软件设计的基本目标就是用比价抽象、概况的方式确定目标系统如何完成预定的任务。也就是说,软件设计是确定系统的物理模型
从工程管理的角度来看可分为两步:概要设计和详细设计
从技术方面来看,软件设计包括结构设计、数据设计、接口设计、过程设计
将软件按功能分解为组成模块,是概要设计的主要任务。划分模块要本着提高独立性的原则。模块独立性的高低决定设计的好坏,而设计又是决定软件质量的关键环节。模块的独立性可以由两个定性标准度量:耦合性和内聚性
模块的内聚性越高,模块间的耦合性就越低,可见模块的耦合性和内聚性是相互关联的。因此应尽量做到高内聚、低耦合
如果根据软件是否需要被执行,可以分为静态测试和动态测试
如果根据功能划分,可以分为白盒测试和黑盒测试
静态测试和动态测试
动态测试的关键是设计高效、合理的测试用例。测试用例就是为测试设计的数据,由测试输入数据和预期的输出结构两部分组成
白盒测试和黑盒测试
数据
描述事物的符号记录称为数据。数据库系统中的数据具有长期保存的特点,它们通常称为持久性数据,而把一般存放在计算机内存中的数据称为临时性数据
数据库
数据库是指长期存储在计算机内的、有组织的、可共享的数据集合
通俗理解,数据就是存放数据的仓库,只不过数据库存放数据是按一定格式的数据模式存放,数据库中的数据具有两大特点:“集成”与“共享”
数据库管理系统
数据库管理系统是数据库的机构,它是一个系统软件,负责数据库中的数据组织,数据操纵,数据维护、控制及保护,数据服务等
数据库管理系统的主要功能包括:数据模式定义,数据存取的物理构造;数据操纵;数据完整性、安全性的定义与检查;数据库的并发控制与故障回复;数据的服务等
数据库管理系统提供了相应的数据语言:
E-R模型采用了3个基本概念:实体、属性及联系
E-R模型的基本概念
实体间联系根据一个实体型中可能出现的每一个实体和另一个实体型中有多少个具体实体存在联系,可归纳为3中类型:
类型 | 实例 |
---|---|
一对一联系 | 一个学校只可以有一个校长,而校长不能在其他学校任职 |
一对多联系 | 一个部门可以有多个职员,一个职员不能有多个部门 |
多对多联系 | 一个学生可以选多门课,一节课也可以被多个学生选 |
E-R图
E-R模型可以用图形来表示,该图形称为E-R图
概念 | 含义 |
---|---|
实体集表示法 | E-R图用矩形表示实体集,并在矩形内写上实体集的名字 |
属性表示法 | E-R图用椭圆形表示属性,在椭圆形内写上该属性的名称 |
联系表示法 | E-R图用菱形表示联系,在菱形内写上联系名 |
关系具有一下7个性质:
满足7个性质的二维表称为关系,以二维表为基本结构所建立的模型称为关系模型
关系模型的完整性约束
关系代数就是关系与关系主键的运算。在关系代数中,进行运算的对象都是关系,运算的结果也是关系
差运算
交运算
并运算
笛卡尔积运算
投影运算
选择运算
除运算
连接运算
数据库设计概述
基本思想:过程迭代和逐步求精
方法:面向数据的方法和面向过程的方法
数据库设计的需求分析
需求收集和分析是数据库设计的第一阶段,常采用结构化分析方法(指顶向下、组层分解)和面向对象的方法,主要工作有绘制数据流图、分析数据、分析功能、确定功能处理模块和数据间关系
数据字典包括数据项、数据结构、数据流、数据存储和处理过程,是对系统中数据的详尽描述
范式
关系数据库中的关系需要满足一定要求,满足不同程度要求的关系为不同的范式。满足最低要求的关系叫第一范式,简称1NF;在满足第一范式的基础上,进一步满足更多要求的关系是第二范式,以此类推。
匿名函数
函数名=lambda 参数:表达式
a=lambda x:print(x)
随机数
随机生成范围为[a,b]的整数
random.randint(a,b)
随机生成范围为[a,b]的小数
random.unifrom(a,b)
生成一个范围为[a,b],以c为步长的随机整数
random.randrange(a,b,c)
生成一个二进制长度为k的随机整数
random.getrandbits(k)
从序列类型中随机选择一个元素
random.choice([1,2,3,4])
把序列中的元素随机排列,返回打乱的序列
random.shuffle([1,2,3,4])
从pop类型中选取k个元素,以列表形式返回
random.sample('abcdefg',3)
pop类型:个人认为是列表、字符串、元组
format进阶用法
填充
print("{:>10}".format('A') # 左对齐
print("{:<10}".format('A') # 右对齐
print("{:*>10}".format('A') # 左对齐填充*
print("{:0=10}".format(3)) # 只适用于数学填充