一、数据结构和算法
1.1 算法
算法的基本概念
算法的基本特征:可行性(所有步骤可实现,执行结果能达到目的),确定性(不能模凌两可,不能多义),有穷性(算法在有限的时间内完成),拥有足够的情报
算法设计基本方法
列举法,归纳法,递推,递归
算法复杂度
- 时间复杂度:即执行算法所需要的计算工作量,算法所执行的基本运算次数。
分析方法
平均性态A(n):基本运算次数的加权平均值。
最坏情况复杂性W(n):算法所执行的基本运算的最大次数。
W(n)比A(n)更具有实用价值。
-
空间复杂度:即执行算法所需的内存空间
压缩存储后空间复杂度降低
时间复杂度 执行算法所需要的计算工作量 空间复杂度 执行算法所需的内存空间
1.2 数据结构
数据结构主要问题:逻辑结构(与所使用的计算机无关),存储结构,对各种数据结构进行的运算。
研究目的:为了提高数据处理的效率。
1.2.1 数据结构的相关概念
- 数据结构:相互有关联的数据元素的集合。
- 数据处理:对数据集合中的各个元素以各种形式进行运算。
- 数据元素:现实世界中一切事物。
- 前件(直接前驱):逻辑关系的前者。
- 后件(直接后继):逻辑关系的后者。
1.2.2 数据的逻辑结构
1.2.2.1线性结构
-
线性表:
- 线性表是n(n>0)个数据元素构成的有限序列,表中除第一个元素外的每一个元素,有且只有一个前件,除最后一个元素外,有且只有一个后件。
- 通常,线性表可以采用顺序存储和链式存储,但一般使用顺序存储结构。线性表的通常,线性表可以采用顺序存储和链式存储,但一般使用顺序存储结构。线性表的顺序存储又叫做顺序表(顺序分配)。
- 特点:
- 存储空间连续
- 按逻辑顺序一次存放
- 可以随机访问数据元素
- 不便插入删除大量元素
-
栈:
- 栈是限定在一端进行插入和删除的线性表。
- 特点:
- 只能在栈顶进行插入和删除
- 先进后出, 后进先出
- 栈底指针 bottom ,栈顶指针 top
- 栈底指针不变,栈中元素随 栈顶 指针的变化而动态变化
- 栈具有记忆功能
- 栈支持子程序调用
- 可实现递归调用
-
队列:
-
队列是指允许在一端进行插入,而在另一端进行删除的线性表。
-
特点:
- 队列只允许在队尾进行插入,而在队头进行删除
- 先进先出 ,后进后出
- 队头指针 front ,队尾指针 rear
- 队列中元素随队头指针和队尾指针的变化而动态变化
-
循环队列:计算:
- rear>front: s=rear-front
- rear<front: s= 容量 +rear-front
- rear=front: s=1 或者 s=0
-
指针 | 位置 |
---|---|
top | 栈顶的一行 |
bottom | 栈底的一行 |
front | 队首的前一行 |
rear | 队尾的一行 |
1.2.2.2 非线性结构
-
树
-
树是 n n>0 )个元素的有限集合。它有且仅有一个称为根的元素;其余元素是互不相交的子树。
-
结构:父结点,子结点,根结点,叶子结点,结点的度,树的度结点的度、树的度(所有结点中最大的度称为树的度),树的深度,子树
-
二叉树
-
一个有限的结点集合,该集合或者为空,或者有一个根结点及其两颗互不相交的左右二叉子树所组成。
-
特点:
- 非空二叉树只有一个根结点
- 每一个结点最多有两颗子树,且分别称为该结点的左子树与右子树
- 在二叉树的第 K 层上,最多有 2k-1 个结点
- 深度为 m 的二叉树最多有 2m -1 个结点
- 度为 0 的结点(叶子结点)总比度为 2 的结点多一个
- 有 n 个结点的二叉树深度至少为 [log2𝑛]+1
-
二叉树的遍历:
-
前序遍历:访问根结点、前序遍历左子树、前序遍历右子树(根左右) ABDGECF
-
中序遍历:中序遍历左子树、访问根结点、中序遍历右子树(左根右) DGBEAFC
-
后序遍历:后序遍历左子树、后序遍历右子树、访问根结点(左右根) GDEBFCA
-
-
-
特殊二叉树
- 满二叉树:除最后一层外,每一层上的结点数均达到最大值 。
- 完全二叉树:除最后一层外,每一层上的结点数均达到最大值,在最后一层上只缺
右边的若干结点 。 - 满二叉树是完全二叉树,但是完全二叉树不一定是满二叉树 。
-
-
图
1.2.3 数据的存储结构
又称为数据的物理结构,是数据的逻辑结构在计算机存储空间中的存放方式。
-
顺序存储
-
链式存储:
-
线性链表:
-
线性表可以采用顺序存储和链式存储。线性表的顺序存储叫做顺序表,线性表的链式存储结构叫做线性链表。
-
特点:
- 各数据结点的存储空间可以不连续
- 各数据元素的存储顺序和逻辑循序可以不一致
- 线性表的链式存储所占存储空间大于顺序存储结构
- 查找结点时链式储存要比顺序存储慢
- 链式存储插入删除元素比顺序存储灵活
-
线性链表的操作:在线性链表中进行插入与删除,不需要移动链表中的元素。
-
-
1.2.4 查找技术
-
顺序查找:对于长度为n的线性表,平均要进行n/2次比较,在最坏的情况下进行n次比较。
-
二分查找:适用于顺序存储的有序表,对长度为n的线性表,在最坏的情况下进行log2𝑛次比较。
查找 最坏情况 顺序查找 n 二分查找 log2n
1.2.5 排序技术
1.2.4.1 交换类排序法
借助数据元素之间的相互交换进行排序的方法。
-
冒泡排序法:通过相邻之间的比较和交换,使值较小的数逐渐从底部移向顶部,值较大的数逐渐移向底部
- 计算:线性表长度为n,最坏情况下,要经过n/2次查找,比较n(n-1)/2次
-
快速排序法:
- 计算:最坏情况下需要进行n(n-1)/2次比较,但实际的排序效率要比冒泡排序高很多。
1.2.4.2 插入类排序法
- 简单插入排序法:选择序列的第一个元素作为有序序列,逐渐将后面的元素插入到前面的有序序列中,直到整个序列有序。
- 计算:最坏情况下比较n(n-1)/2次。
- 希尔排序法
1.2.4.3 选择类排序法
- 简单选择排序:每次选择无序数列中最小的将其放在有序数列的最后。
- 堆排序:时间复杂度最小
排序 | 平均时间 | 最坏情况 |
---|---|---|
冒泡排序 | n(n-1)/2 | n(n-1)/2 |
快速排序 | n(n-1)/2 | n(n-1)/2 |
插入排序 | n(n-1)/2 | n(n-1)/2 |
希尔排序 | nlog2𝑛 | n3/2 |
选择排序 | n(n-1)/2 | n(n-1)/2 |
堆排序 | nlog2𝑛 | nlog2𝑛 |
二、程序设计
2.1 程序库设计方法和风格
- 整体风格:清晰第一,效率第二
- 源程序文档化:
- 符号名的命名
- 程序注释
- 视觉组织
- 数据说明的方法:
- 数据说明的次序规范化
- 说明语句中变量安排有序化
- 使用注释来说明复杂数据的结构
- 语句的结构
- 输入和输出
2.2 结构化程序设计
-
结构化程序设计原则:自顶而下,逐步求精,模块化,限制使用goto语句
-
结构化程序设计基本结构与特点:顺序结构(最基本,最常用的结构),选择结构,循环结构
2.3 面向对象的程序设计
2.3.1 面向对象编程的优点
- 与人类习惯的思想方法一致
- 稳定性好
- 可重用性好
- 易于开发大型软件产品
- 可维护性好
- 软件稳定性好
- 容易修改
- 容易理解
- 易于测试与调试
2.3.2 基本概念
- 对象:在现实世界中,每个实体都是对象
- 对象基本特点:识别唯一性,分类型,多态性,封装性
- 类:类是一组具有相同属性和相同操作的对象的集合。
- 实例:一个对象是其对应类的一个实例
- 消息:是一个实例与另一个实例之间传递的信息。对象间的通信靠消息传递。
- 组成:
- 接收消息的对象的名称
- 消息标识符(消息名)
- 零个或多个参数
- 组成:
- 继承:使用已有的类建立新类的定义技术
- 优点:
- 共享程序代码和数据结构
- 减少程序冗余信息
- 提高软件可重用性
- 便于软件维护修改
- 优点:
- 多态性:是指同样的消息被不同的对象接受时可导致完全不同的行动的现象。
三、软件工程
3.1 软件工程概念
-
软件定义:是由程序、数据及其相关文档构成的集合。
-
软件的特点:
- 软件是逻辑实体,具有抽象性
- 没有明显的制作过程
- 运行使用不存在磨损和老化
- 对计算机系统具有依赖性
- 复杂性高,成本昂贵
- 开发涉及诸多社会因素
-
分类:
- 应用软件:事务处理软件、工程与科学计算软件、实时处理软件、人工智能软件
- 系统软件:操作系统、编译程序、汇编程序、网络软件、数据库管理系统
- 支撑软件(工具软件):需求分析工具、编译工具软件、测试工具软件、维护工具软件。
-
软件危机:需求增长、开发难控、质量难保、难以维护、提高成本、生产率低。
-
软件工程:
- 定义:应用于计算机软件的定义、开发和维护的一整套方法、工具、文档、实践标准和工序
- 目的:提高软件生产率、提高软件质量、降低软件成本。
- 核心思想:把软件当作一个工程产品来处理。
- 三要素:方法,工具,过程
- 内容:软件开发技术,软件工程管理
- 软件工程原则:抽象,信息屏蔽,模块化,局部化,确定性,一致性,完备性,可验证性
-
软件过程:
- 软件规格说明
- 软件开发,设计与实现
- 软件确认
- 软件演进
-
软件生命周期
- 定义:将软件产品产品能够提出、实现、使用维护到停止使用退役的过程称为软件生命周期。
- 时期:
- 软件定义:可行性研究,需求分析
- 软件开发:概要设计,详细设计,实现,测试
- 软件运行维护:使用,维护
- 软件维护是持续时间最长,花费代价最大的一个时期。
3.2 结构化分析方法
-
需求分析:
- 过程:需求获取,需求分析,编写需求规格说明书,需求评审
- 方法:结构化分析方法,面向对象的分析方法
-
结构化分析方法:
-
使用数据流图(DFD),数据字典(DD),判定表和判定树等工具,来建立系统的逻辑模型。
-
常用工具:
-
数据流图
图形元素 名称 ◯ \bigcirc ◯ 加工(转换) → \rightarrow → 数据流 = 数据源 □ \square □ 数据源点和终点 - 建立步骤:由外向里,自顶而下,逐层分析
-
数据字典:结构化分析方法的核心
符号 含义 A=B 等于,由什么构成 [A|B] A或B A+B A与B,A和B n{A}m 重复,n,m为重复上下限 (A) A可选 * * 注释 A…B 连接符,A和B之间任意值 -
判定树
-
判定表
-
-
-
软件需求规格说明书
- 作用:
- 便于客户和开发人员交流
- 作为软件开发的基础和依据
- 作为测试依据
- 便于成本预算和进度估计
- 软件不断改进的基础
- 内容:描述软件目标,功能需求,性能需求,外部接口,属性,约束条件
- 特点:正确性,无歧义性,完整性,可验证性,一致性,可理解性,可修改性,可追踪性
- 作用:
3.3 结构化设计方法
-
重要性:
- 软件开发阶段占软件项目总成本的绝大部分,而软件设计是软件开发最重要的步骤。
- 软件设计作出的决策影响软件实现的成败。
- 设计是软件工程和维护的基础。
-
分类:
- 从工程管理角度划分:概要设计,详细设计
- 按技术观点划分:结构设计、数据设计、接口设计、过程设计
-
基本原理:抽象,逐步求精和模块化,信息屏蔽和局部化,模块独立性(高内聚,低耦合)
-
概要设计:
-
概要设计的任务:
- 设计软件系统结构
- 数据结构及数据库设计
- 编写概要设计文档
- 概要设计文档评审:工具:程序结构图(SC)
-
程序结构图
-
面向数据流的结构化设计方法
- 数据流类型:变换型,事务型
- 设计过程:
- 分析确认数据流图的类型
- 说明数据流边界
- 把数据流图映射为程序结构
- 根据设计准则对结构进行细化求精
-
设计准则:
- 提高模块独立性
- 模块规模适中
- 深度,宽度,扇出,扇入适当
- 使模块的作用域在该模块控制域内
- 减少模块接口和界面的复杂性
- 设计成单入口,单出口的模块
- 设计功能可预测的模块
-
-
详细设计
-
详细设计的任务:确立每个模块的实现算法和局部数据结构,用适当方法标识算法和数据结构的细节。
-
工具:
-
图形工具:
-
程序流程图
符号 含义 ⟶ \longrightarrow ⟶或 ↑ \uparrow ↑ 控制流 □ \square □ 加工步骤 ⋄ \diamond ⋄ 逻辑条件 -
N-S图
-
PAD图
-
HIPO图
-
-
表格工具:判定表
-
语言工具:PDL(伪码)
-
-
3.4 软件测试
- 软件测试的目的:为了发现错误而执行程序的过程
- 软件测试涵盖整个软件生命周期的过程,包括需求定义阶段的需求测试,编码阶段的单元测试,集成测试以及后期的确认测试,系统测试。
- 软件测试的准则:
- 所有测试都应追溯到用户需求
- 严格执行测试计划
- 充分注意测试中的群集现象
- 避免由程序的编写者测试自己的程序
- 不可能进行穷举测试
- 妥善保存测试分析报告,为维护提供方便
- 类别:
- 按是否需要执行被测软件分类:
- 静态测试:不实际运行软件,通过人工进行
- 动态测试:基于计算机的测试,要执行程序的过程
- 按功能分类:
- 白盒测试:利用程序内部的逻辑结构,对程序所有逻辑路径进行测试
- 逻辑覆盖测试
- 基本路径测试
- 黑盒测试:完全不考虑程序内部的逻辑结构,只依据程序的需求和功能规格说明是否满足
- 等价类划分法
- 边界值分析法
- 错误推测法
- 白盒测试:利用程序内部的逻辑结构,对程序所有逻辑路径进行测试
- 按是否需要执行被测软件分类:
- 软件测试步骤:
- 单元测试:是对软件设计的最小单位——模块进行测试,目的是发现各模块内部的错误。
- 集成测试:是把模块按照设计要求组装起来的同时进行测试,目的是发现与接口有关的错误。
- 确认测试:是验证软件功能和性能是否满足各种要求,以及软件配置是否完全、正确。
- 系统测试:是将软件作为一个元素,与计算机系统其他元素组合在一起,进行集成测试。
3.5 程序调试
- 程序调试步骤
- 错误定位
- 修改设计和代码
- 回归测试
- 软件调试方法
- 强行排错法
- 回溯法
- 原因排除法
四、数据库设计
4.1 基本概念
-
数据:描述事物的符号纪录称为数据,有型与值之分
-
数据库(DB):是指长期存储在计算机内的,有组织的,可共享的数据集合
- 特点:集成,共享
-
数据库管理系统(DBMS):数据库管理系统是数据库系统的核心
- 功能:
- 数据模式定义
- 数据存储的物理构建
- 数据操纵
- 数据的完整性,安全性定义与检查
- 数据库的并发控制与故障恢复
- 数据的服务
- 语言:
- 数据定义语言(DDL):数据模式定义,数据存取的物理构建
- 数据操纵语言(DML):数据操纵,包括查询与增、删、改等操作
- 数据控制语言(DCL):数据的安全性的定义域检查,并发控制与故障恢复,数据的完整性
- 功能:
-
数据库管理员(DBA)
- 工作
- 数据库设计
- 数据库维护
- 改善系统性能,提高系统效率
- 工作
-
数据库系统(DBS)
-
组成:
- 数据库
- 数据库管理系统
- 数据库管理员
- 硬件平台:计算机,网络
- 软件平台:操作系统,数据库系统开发工具,接口软件
-
特点:
- 数据的集成性
- 数据的高共享性与低冗余性
- 数据独立性:物理独立性,逻辑独立性
- 数据统一管理与控制
-
内部结构体系:
-
三级模式:概念模式,外模式(子模式/用户模式),内模式(物理模式)
-
二级映射:概念模式到内模式的映射,外模式到概念模式的映射
两级映射保证了数据库中数据具有较高的逻辑独立性和物理独立性。
-
-
-
数据库应用系统:
- 组成:数据库系统,应用软件,应用界面
-
数据库发展:
-
人工管理阶段
-
文件系统阶段
-
数据据库系统阶段
- 层次数据库与网状数据库系统阶段
- 关系数据库系统阶段
数据库技术的根本目标是:解决数据共享问题
-
4.2 数据模型
-
内容:数据结构,数据操作,数据约束
-
按应用层次分类:
- 概念数据模型(概念模型):
- E-R模型
- 面向对象模型
- 逻辑数据模型(逻辑模型):
- 层次模型:树形结构
- 网状模型:无条件限制的无向图
- 关系模型:二维表
- 面向对象模型
- 物理数据模型(物理模型)
- 概念数据模型(概念模型):
-
E-R模型
-
概念:
- 实体:现实世界的事物
- 属性:现实世界中事物的特性
- 联系:现实世界中事物间的关联
- 一对一(1:1)
- 一对多(1:n)
- 多对多(m:n)
-
-
关系模型
-
属性:二维表中的一列称为属性
-
元组:二维表中的一行称为元组
-
二维表由表框架和表的元组组成,表框架由多个属性组成
-
键和码:能唯一识别元组的最小属性集
- 候选键(候选码)
- 主键(主码):用于唯一标识表中的每一条数据,主键不能为空值。
- 外键(外码):表A中的某属性集是表B的键
-
关系操纵:查询,增加,删除,修改
-
关系中的数据约束:
-
实体完整性约束:主键中属性值不为空值
-
参照完整性约束:不能应引用不存在的元组
-
用户定义的完整性约束。
-
-
4.3 关系代数
- 关系模型的基本操作:
- 关系的属性指定
- 关系的元组的选择
- 两个关系的合并
- 关系的查询
- 关系元组的插入
- 关系元组的删除
- 关系模型的基本运算
- 插入
- 删除
- 修改
- 查询
- 投影运算
- 选择运算
- 笛卡儿积: T = R × S T=R\times S T=R×S,R中的每一行与S中的每一行组合为T的一行
- 关系代数的扩充运算:
- 交: T = R ∩ S T=R\cap S T=R∩S,T的每一行为R和S相同的行
- 除: T / R = S T/R=S T/R=S,R的一行包含在T的一行中,则T的这一行其它元素在S中
- 连接:满足条件的R行与S行组合在一起,作为一行T
- 自然连接: T = R ⋈ S T=R\bowtie S T=R⋈S,R与S含有同一属性D,将两者D属性相同的行连接在一起
4.4 数据库设计与管理
-
数据库设计概述:
- 核心问题:设计一个能满足用户要求,性能良好的数据库。
- 基本任务:根据用户对象的信息需求,处理需求和数据库的支持环境设计出数据模式。
- 方法:
- 面向数据的方法:以信息需求为主,兼顾处理需求
- 面向过程的方法:已处理需求为主,兼顾信息需求
面向数据的设计方法已成为主流方法。
-
数据库设计的步骤:生命周期法
- 需求分析阶段:建立数据字典
- 概念设计阶段:设计E-R图
- 逻辑设计阶段:把E-R图转换为关系模式。实体与联系表示成关系,E-R图中属性转换成关系的属性
- 物理设计阶段
- 编码阶段
- 测试阶段
- 运行阶段
- 进一步修改阶段。
在数据库设计中采用前四个阶段,并且重点以数据结构与模型的设计为主线。
-
数据库管理:
- 数据库的建立
- 数据库的调整
- 数据库的重组
- 数据库安全性控制与完整性控制
- 数据库的故障恢复
- 数据库监控