什么是数据结构
定义
数据:描述客观事物的数和字符的集合
数据元素:数据的基本单位,可由若干数据项组成。节点、记录。
数据项:独立含义的数据最小单元,域、字段
数据对象:性质相同的数据元素的集合
数据结构:所有数据元素 及 数据元素之间的关系,相互之间存在某种特定关系的数据元素的集合。
运算:在数据上的操作。
数据结构 定义:描述现实世界实体的数学模型及其之上的运算在计算机中如何表示和实现的学科。
逻辑结构
定义:数据的逻辑结构是从数据元素的逻辑关系上来描述数据,指数据元素之间的逻辑关系的整体,通常是从求解问题中提取出来的。
现实中数据元素逻辑关系很复杂,数据结构中主要讨论数据元素之间的 相邻关系、临近关系。
逻辑结构的表示
1. 图表表示
表格或图形直接描述数据的逻辑关系
2. 二元组表示
通用的逻辑结构表示方法
B = (D,R)
D = {1,2,3,4 ...}
R = {r1,r2 ...}
r1 = {<x1,x2>, <x3,x4> ...}
R 中的 rx 是序偶的集合,x1为x2 的直接前驱简称前驱,x2为x1 的直接后驱简称后驱。
对称序偶(<x,y> == <y,x>) 可以用 (x,y) 表示,用不带箭头的连线表示
逻辑结构的类型
1. 集合
- 除同属一个集合外,无其他关系。
2. 线性结构
- 数据元素之间一对一的关系
- 开始和终端节点唯一
- 除开始和终端外其余元素有且仅有一个前驱、后驱元素
3. 树形
- 一对多关系
- 除开始元素外,每个元素仅有一个前驱,除终端元素外,每个元素有一个或多个后去
4. 图形
- 数据元素之间多对多关系
- 每个元素的前驱和后驱、开始终端元素个数任意
- 图形和树形是非线性结构
- 线性是树形结构的特殊情况
- 树形是图形结构的特殊情况
存储结构
数据逻辑结构在计算机中的存储表示为数据的存储结构。
逻辑结构在计算机中的存储实现。
既要存储数据元素,又要存储元素逻辑关系。
1. 顺序存储结构
- 定义:连续存储单元存放所有数据,存放在一整块存储空间内,逻辑和存储位置相同。
- 优点:
- 存储效率高,不占用额外空间存储元素关系。
- 随机存取,可以直接计算出要找的元素。
- 缺点:
- 不便于修改,元素的删除和插入需要移动一系列元素。
2. 链式存储结构
- 定义:每个元素占用一个内存结点存储,但不一定连续,每个结点附加指针域存放相邻结点的存储地址。首结点指针为head,标识整个链表,尾结点为空
- 优点:
- 便于随机修改,仅需要修改相应结点指针域。
- 缺点:
- 空间利用率低,需要专门为指针域分配空间。
- 不能实现随机存储,想要找到一个结点必须找到他的上一个结点。
3. 索引存储结构
-
定义:存储数据元素信息的同时创建一个附加索引表,主数据表用于存储所有数据元素信息,每个数据元素有一个关键字和对应的存储地址。
索引表中的索引项一般包括 “ 关键字,地址 ” 通常索项是按关键字有序排列
查找的时候先根据排列快速找到对应元素,再找到对应地址。
-
优点:
- 查找效率高
-
缺点:
- 内存开销大,建立索引表
4. 哈希(散列)存储结构
- 定义:根据元素关键字通过 哈希函数 计算出一个值作为 地址,存储该元素。
- 优点:
- 查找速度快,只要给出关键字就可以找到该元素地址
- 内存占用小,不存储逻辑关系
- 以上简单存储方法可以单独使用也可以混合使用。
- 根据具体要求使用不同的方法,主要考虑运算方便和算法时空要求。
数据运算
对数据实施的操作
- 数据运算 分为 运算定义、运算实现。
- 运算定义:是运算的描述,是抽象的、逻辑的。
- 运算实现:是完成运算的实现算法,是具体的,基于存储结构。
一种数据结构逻辑结构是唯一的,但可能对应多种存储结构,并且不同存储结构中同一算法的实现过程可能不同。
数据类型 & 抽象数据类型
**数据类型:**一组性质相同的值的集合和定义在此集合上的一组操作的总和,是某种语言中已实现的数据结构。
抽象数据类型(ADT):进行系统设计时从问题的数学模型中抽象出来的逻辑数据结构和逻辑数据结构上的运算,不考虑具体存储结构和运算的实现。
基本描述格式:(DSP)三元组。
ADT 抽象数据类型名
{ 数据对象:数据对象的声明
数据关系:数据关系的声明
基本运算:基本运算的声明
}
基本运算声明格式:
基本运算名(参数表):运算功能描述
基本运算参数: 1. 值传递 2. & 引用参数 。
ADT 特征:数据抽象、数据封装。(强调本质特征和功能,以及外部用户接口、外部特征和内部实现细节分离)
ADT 由数据逻辑结构 和 运算定义 两部分组成。
![image-20220316182643791](https://i-blog.csdnimg.cn/blog_migrate/2ad9d1211cf5e6892193effcdf5e0254.png)
算法
对特定问题求解步骤的描述,指令的有限序列
五大特征
- 有穷性:有穷布,每步都有穷时间内完成。
- 确定性:含义明确,相同输入对应相应输出,无二义性。
- 可行性:算法中所有操作都是基本操作。
- 有输入:0-n 个输入。
- 有输出:1-n 个输出。
- 算法必须满足有穷性,而程序不用。
算法设计目标
- 正确性:正确执行预先设计的功能和性能要求。
- 可使用性:方便使用,用户友好。
- 可读性: 容易理解,逻辑清楚简单,结构化。
- 健壮性:良好容错,异常处理,输入校验。
- 高效率与低存储量需求:执行时间短,所需空间小。
算法描述
返回值 算法对应函数名(形参列表)
{
临时变量定义
实现输入到输出参数的操作
...
}
算法设计:
- 分析功能
- 确定输入输出参数
- 设计函数体,完成输入到输出的过程
算法分析
分析算法占用计算机资源的多少(CPU时间 和 内存空间)
分为:
事后统计法(必须执行程序,存在因素掩盖算法本质)
事前估计法(撇开其他因素,仅考虑算法本身)
O(1) < O(log2n) < O(n) < O(nlog2n) < O(n2) < O(n3) < O(2n) < O(n!)
多项式复杂度: P : log2n n nlog2n n2 n3
指数复杂度 :NP : 2n n!
时间复杂度
-
计算算法频度 T(n)
算法原操作的执行次数(频度)他是问题规模 n 的函数,用 T(n) 表示 。
算法执行时间与 T(n) 成正比,比较 T(n) 大小比较算法执行时间。
-
O 表示 T(n)
只求出 T(n) 的最高阶,忽略低阶和常数项
-
简化的时间复杂的分析
T(n) = 基本操作 * 运算次数
基本操作:算法中最深层循环的原操作
-
求和求积定理
T1(n) + T2(n) = O(max( f(n) , g(n) )) 并列循环
T1(n) * T2(n) = O(f(n) * g(n)) 循环嵌套
-
最好、最坏、平均时间复杂度
输入规模 n,Dn 为所有输入的集合,任意输入I ∈Dn,P(I) 是 I出现频率,T(I) 是I 执行的基本操作次数。
B(n) = min ( T(n) )
W(n) = max( T(n) )
E(n) = ∑ P(I) * T(I)
-
递归算法复杂度分析也成为变长时空分析,非递归分析为定长时空分析。
先写出递推式,求递推式得出复杂度。
空间复杂度
算法占用存储量包括:数据、程序本身、临时变量
空间复杂度是对算法运行过程中临时变量占用存储大小的分析
-
S(n) = O( g(n) )
-
占用存储大小与问题规模无关,仅仅是常数,则称为:原地工作算法、就地工作算法 O(1)
-
递归算法空间复杂度:先写出递推式,求递推式得出复杂度。
数据结构+算法=程序
- 程序就是在数据的某些特定的表示方法和结构的基础上对抽象算法的具体表述
- 需要从算法与数据结构的统一上去认识程序
- 存储结构对算法的影响:
- 存储结构的存储能力
- 存储结构与所选择的算法相适应
ps. 萌新小白,欢迎私信或评论区交流指正,教材参考清华大学出版社《数据结构教程》第五版