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