数据结构
文章目录
第0节 算法基础
算法分析的目的:分析算法的效率以求改进。
计算机算法:对特定问题求解步骤的一种描述,是指令的有限序列。其中每一条指令表示一个或多个操作。
算法特性:输入、输出、可行性、有穷性、确定性
第一节 数据结构的基本概念
数据结构:指相互有关联的数据元素的集合。
常见术语:
- 数据:计算机处理的对象
- 数据元素:数据的基本单位(一个数据元素可由若干数据项组成),又称作结点或记录
- 数据项:数据的最小单位,也称作字段或域
数据结构三个层次:
- 逻辑结构:反应数据元素之间逻辑关系的数据结构。
- 表示数据元素的信息
- 表示各数据元素之间的前后件关系
- 存储结构:数据的逻辑结构在计算机存储空间中的存放形式(也称为数据的物理结构)
- 运算:插入、删除、修改、查找、排序等,其依赖于存储结构
数据结构三个层次之间的关系:
- 逻辑结构唯一,存储结构不唯一
- 存储结构是逻辑结构在计算机存放形式
- 运算的实现依赖于存储结构
数据结构的描述:
G
r
o
u
p
=
(
D
,
R
)
Group=(D,R)
Group=(D,R)
D:有限个数据元素的集合
R:有限个结点间关系的集合
为了反映各元素之间的前后件关系,一般用如下二元组进行表示. ( a , b ) (a,b) (a,b)表示a是b的前件,b是a的后件.
线性结构:一对一
特性:1.有且只有一个根结点 2.每个结点最多一个前件,最多一个后件。(第一个数据元素无前件,最后一个无后件,其它有且仅有一个前驱和一个后继。)
非线性结构:多对多
存储结构的三种类型:
顺序存储:用一组连续的存储单元依次存储数据元素,数据元素之间的逻辑关系由元素的存储位置来表示。
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/de3f08a395b1383f50ee311278345b8e.png)
链式存储:用一组任意的存储单元存储数据元素,数据元素之间的逻辑关系用指针来表示.
-
其每个节点都由两部分组成
1️⃣数据域存放元素本身的数据
2️⃣指针域存放指针
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/6dbf5a8453f849204e637e5249c2a6b0.png)
索引存储:将具有n个结点的线性表按性质划分成m个子表,然后分别存储此m个子表,且对这m个子表建立一个索引表。
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/00f388d18375ed9007792416dc098fe7.png)
第二节 线性结构
线性表
定义:由n个元素构成的一个有限序列。除了第一个元素外,有且只有一个前件;出了最后一个元素外,有且只有一个后件。
特性:1️⃣数据元素之间呈现线性关系2️⃣同一个线性表内的元素必须是相同的数据类型
顺序表和链表的特点
顺序表:
优点:1.存储密度大(结点本身所占存储量/结点结构所占存储量)2. 可以随机存取表中任一元素
缺点:1.在插入、删除某一元素时,需要移动大量元素 2. 浪费存储空间 3.属于静态存储形式,数据元素的个数不能自由扩充
实现循环队列
假设循环队列的初始状态为空,即s=0,且front=rear=m
队满的条件:s=1,front=rear
(sq.rear+1)%maxsize==sq.front
,在具有n个单元的循环队列中,队满时共有n-1个元素
![image-20230209145658015](https://i-blog.csdnimg.cn/blog_migrate/968eaba7dc1589a08bc6efe9977e4c75.png)
![image-20230209145711280](https://i-blog.csdnimg.cn/blog_migrate/ad3efdc4d2d65b68b63f32fcb8d64919.png)
######实现循环队列的入队#######
#include<iostream>
using namespace std;
template <typename T>
void insertcq(T *q,int m,int *rear,int *front,int *s,T x)
{
if((*s==1)&&(*rear==*front)){
cout<<"Queue-overflow\n";
return;
}
*rear=*rear+1;
if(*rear==m+1) *rear=1;
q[*rear-1]=x; *s=1;return;
}
######实现循环队列的出队#######
#include<iostream>
using namespace std;
template <typename T>
void delcq(T *q,int m,int *rear,int *front,int *s)
{
T y;
if(*s==0){
cout<<"Queue-underflow\n";
return;
}
*front=*front+1;
if(*front==m+1) *front=1;
*y=q[*front-1];
if(*front==*rear) {
*s=0;
}
return;
}
第三节 非线性结构
树
相关术语
- 根节点:没有前驱,仅有后继
- 分支结点:有且仅有一个前驱,可以有多个后继
- 叶结点:没有后继,仅有前驱
- 结点的度:该结点拥有的子树数目。
- 树的度:最大的结点度
- 深度:最大的层次数
操作系统
操作系统概述
定义:控制和管理系统资源,方便用户使用计算机的程序集合
作用:
- 管理系统资源
- 为用户提供资源共享的条件和环境,并对资源的使用进行合理调度。
- 提供良好的输入输出的方便环境
- 规定用户的接口
功能和主要任务:
- 处理机管理;2.存储器管理;3.设备管理;4.文件管理;5.作业管理
批处理系统、分时系统、实时系统:
- 批处理:作业成批进入系统后被队列,然后调度权限全部交给系统
- 分时:对若干个并发程序对CPU的分时,其中每个程序对cpu的时间分享单位为时间片(解决人机交互,进行及时响应,共享主机,方便进行程序的调试);特点:同时性、独立性、及时性、交互性
- 实时系统:对随即发生的外部事件做出及时的响应并对其进行处理
- 实时过程控制系统:工业生产的自动化控制、导弹发射等自动控制和实验过程控制
- 实时信息处理系统:机票预定、资料查询等。
进程和程序
顺序程序的特点:
1.顺序性;2.封闭性;3.可再现性
并发程序的特点:
1.并行性;2.共享性
程序的定义:由若干条具有一定功能的机器指令所组成的集合,其之间存在顺序关系
进程:指—个具有—定独立功能的程序关于某个数据集合的一次运行活动。进程是可以并发执行的程序的执行过程,它是控制程序管理下的基本的多道程序单位。
![image-20230208212654427](https://i-blog.csdnimg.cn/blog_migrate/35453be5f433e1faed050d63351af65e.png)
进程的状态及转化:
1.运行状态:正在占据着CPU
2.就绪状态:该进程已经获得除CPU以外的所有资源,只是因为缺少CPU而不能运行下去。
3.等待状态:一个进程正在等待某个事件而暂时停止执行。
进程只能在运行状态下结束。
![image-20230208214402869](https://i-blog.csdnimg.cn/blog_migrate/860e9c75d03043c8e11e73ed0bdbacc5.png)
定义:若干个进程均因互相等待对方所占有的资源而无限等待。
必要条件:
- 资源的独占抢用
- 资源的非抢占分配
- 资源的部分分配
- 对资源的循环等待
预防方法:
- 资源的部分分配(用来破坏第三个必要条件)
- 资源的顺序分配法:破坏第4个条件
- 银行家算法进行动态分配
临界资源:排他性使用的资源,一次只允许一个进程使用的资源。
临界区:在具有互斥关系的各个进程之中,访问临界资源的程序段称为临界区或临界段(只针对某一资源而言的)
PV操作是低级通信原语,信号量是一个只能由P/V操作改变其值的整数变量。
![image-20230208220159778](https://i-blog.csdnimg.cn/blog_migrate/0b3978e3b0bde48bba335650ce59edaa.png)
进程的互斥:
-
当多个进程共享数据块或其他排他性使用的资源时,不能同时进入存取或使用,但进入的次序可以是任意的
信号量实现进程互斥
进程的同步:
- 进程之间为了合作完成一个任务,而需要互相等待和交换信息的相互制约关系
![image-20230209115607243](https://i-blog.csdnimg.cn/blog_migrate/e3e67616b375b61cae6924923e2de6bb.png)
信号量实现进程同步
进程通信:
- 信号同步:低级通信原语,只要收到信号就能知道含义
- 信件同步:高级通信原语,收到信件,对信件进行分析,然后采取相关操作。
存储空间的组织
存储管理的功能:
- 地址变换
- 内存分配
- 存储共享与保护
- 存储器扩充
地址变换(地址映射):
- 当用户程序进入内存执行时,必须把用户程序中所有相对地址转换成内存中的实际地址,否则用户程序无法执行。
地址重定位:
- 在进行地址变换时,必须修改程序中所有与地址有关的项,要对程序中的指令地址以及指令中有关地址的部分进行调整。
内零头:指分配给作业的存储空间中未被利用的部分
外零头:指系统中无法利用的小存储块
分页存储管理的优点为:
(1)由于提供了大容量的虚拟存储器,用户的地址空间不再受内存大小的限制,大大方便了用户的程序设计;
(2)由于作业地址空间中的各页面都是按照需要调人内存的,不用的信息不会调入内存,很少用的信息也只是短时间驻留在内存,因此更有效地利用了内存;
(3)由于动态分页管理提供了虚拟存储器,每个作业一般只有一部分信息占用内存,从而可以容纳更多的作业进人系统,这就更有利于多道程序的运行。
分页存储器的缺点是不利于程序的动态连接装配,也不利于程序与数据的共享。
分段存储管理的优点是有利于程序的动态连接装配,也有利于程序与数据的共享,从而更有利于用户的程序设计。
分段存储器的缺点是不利于内存的有效利用。
![image-20230209133108126](https://i-blog.csdnimg.cn/blog_migrate/1faac4358135adfd4771baac408b9ca5.png)
![image-20230209133124060](https://i-blog.csdnimg.cn/blog_migrate/ef2ea870d9741a6c7dd352b862de599e.png)
![image-20230209133012765](https://i-blog.csdnimg.cn/blog_migrate/bddc4ae103ad885466ed646ba9ec4e4c.png)
数据库技术
数据描述:
-
现实世界:所有客观存在的事物及其相互之间的联系
-
观念世界:1️⃣属性2️⃣实体3️⃣实体型4️⃣实体集
-
数据世界:
数据项(字段)、记录、记录型、文件、关键字
数据模型:
-
层次模型:1️⃣有一个数据记录没有父亲,这个记录为根节点2️⃣其他数据记录有且一个父亲
-
网状模型:1️⃣可以有一个以上的结点没有父亲2️⃣至少有一个结点有多于一个的父亲
-
关系模型:关系必须规范,满足一定规范条件,关系的每一个分量必须是不可分的数据项
关系运算:
- 笛卡尔积:第一个元组每个元素与第二个元组每个元素进行组合
- 投影运算:类似于提取某几列的操作
- join:保留了条件列
- natural join:去除重复属性
数据库设计
E-R图也称实体-联系图(Entity Relationship Diagram),提供了表示实体类型、属性和联系的方法,用来描述现实世界的概念模型。它是描述现实世界关系概念模型的有效方法。是表示概念关系模型的一种方式。用"矩形框"表示实体型,矩形框内写明实体名称;用"椭圆图框"表示实体的属性,并用"实心线段"将其与相应关系的"实体型"连接起来;用"菱形框"表示实体型之间的联系成因,在菱形框内写明联系名,并用"实心线段"分别与有关实体型连接起来,同时在"实心线段"旁标上联系的类型(1:1,1:n或m:n)。
利用E-R模型进行数据库的概念设计,可以分成三步:首先设计局部E -R模型,然后把各个局部E-R模型综合成一个全局的模型,最后对全局E-R模型进行优化。
分E-R图:各个实体与属性之间的联系,以及实体与实体之间的联系
![image-20230209135842264](https://i-blog.csdnimg.cn/blog_migrate/a8b4e0477358da07753836a8df899376.png)
初步ER图:存在属性域、命名、结构冲突
基本E-R图
![image-20230209135936642](https://i-blog.csdnimg.cn/blog_migrate/c28f2223acf74a1cd8d9c2f3f2d43640.png)
实体转为关系结构:
-
每个实体型转为一个关系模式
-
每个联系分别转为关系模式
- 主键需要标注#
- 外键为下波浪号
软件技术
软件生命周期
软件定义期:包括问题定义、可行性研究、需求分析
软件开发期:包括系统设计、详细设计、编码和测试四个阶段
软件维护期:运行维护阶段(持续时间最长、付出代价最大的阶段)
-
问题定义:定义开发项目的背景、目标、实现功能、性能指标及系统需要解决的问题。
-
可行性研究
-
需求分析:通过调研分析全面理解系统需求(关于系统做什么)
- 确定对系统的综合要求
- 对系统的数据要求进行分析
- 推到系统详细模型系统
- 修正开发计划,建立模型系统
-
总体设计:描述系统如何做,怎样实习目标系统
-
详细设计
-
编码
-
测试
1️⃣测试的目的:尽量发现程序中的错误,绝不能证明程序的正确性
2️⃣调试的目的:推断错误原因,进一步改正错误
-
运行维护阶段
![image-20230209142927585](https://i-blog.csdnimg.cn/blog_migrate/95f8985723ce13d60b3d234346d2083c.png)
白盒测试:根据对程序内部逻辑结构的分析来选择测试用例。
黑箱测试:完全不考虑程序的内部结构和特征,只是根据程序功能导出测试用例
结构化设计:把一个大型系统分解为若干个相对独立、功能单一的模块。同时提出了评价模块结构图质量的具体标准,模块之间的耦合度以及模块各个成分之间的联系。