1. 数据结构的基本概念
1.1 基本概念和术语
1. 数据
* 描述客观事物的符号,是计算机中可以操作的对象。
* 注意:
1. 数据有两个特点:一是可以输入到计算机中,二是能够被计算机处理
2. 数据不仅仅包含整型等数值类型,还包括字符、声音、图像等非数值类型。
2. 数据元素:组成数据的,有一定意义的基本单位。(类似于java中的对象)。
3. 数据项:组成数据的不可分割的最小单元。
4. 数据对象:**性质相同**的数据元素的集合,是数据的子集。
5. 数据结构:指相互之间存在一种或多种特定**关系**的数据元素的集合,包括逻辑结构和物理结构。。即带“结构”的数据元素的集合。
* 特点:
1. 数据对象:由数据元素的集合得到
2. 数据元素的关系:表现在三个方面
1. 逻辑结构方面
* 比如数据元素间是一对多的关系
2. 物理结构方面
* 比如数据元素间是顺序存放
3. 运算操作方面
* 比如在一组数据元素后面添加一个数据元素
* 注意:
1. 逻辑结构、物理结构和操作关系是数据结构的三要数。
2. 平时,我们把运算操作单独拿出来说,所以数据结构可以用(数据对象,数据元素的关系,基本操作集)三元组定义
6. 数据类型:是**值的集合**和定义在此集合上的**一组操作**的总称。
* 分类
1. 原子类型:其值不可再分的数据类型。比如int
2. 结构类型:其值可以再分解为若干分量的数据类型。比如c语言中Student结构体,可以分为int, char[]...
3. 抽象数据类型:是抽象数据与其一组相关操作。
* 格式:
ADT 抽象数据类型名
{
Data:
数据元素之间逻辑关系的定义;
Operation:
操作1;
操作2;
...
}
* 说明:一个ADT可以用三元组(数据对象、数据关系、基本操作集)。也就是定义了数据结构(此时不关心物理结构,物理结构的不同对应不同的数据结构)。
其关系可以用下面这张图概括:
1.2 数据结构三要素
* 数据结构三要素
1. 逻辑结构
2. 物理结构
3. 数据的运算
注意:如果满足这三个条件,但是三要素中的任意一个不相同,都叫做不同的数据结构。
1.2.1 逻辑结构
1. 逻辑结构:指数据元素之间的逻辑关系,他更贴近于现实,独立于计算机。
2. 分类
1. 线性结构 -->一对一
1. 线性表
2. 队列
3. 栈
2. 非线性结构
1. 集合
2. 树形结构 -->一对多
3. 图状结构 -->多对多
1.2.2 存储结构
1. 存储结构:指数据在计算机内的存储方式,也称为物理结构
2. 分类:
1. 顺序存储
* 指逻辑上相邻的元素,在物理存储上也相邻。
2. 非顺序结构
1. 链式存储
* 指逻辑上相邻的元素,在物理存储上不一定相邻,存放下一个数据元素的地址需要根据上一个数据元素得到。
2. 索引存储
* 指根据索引直接得到存放数据元素的地址
* 需要构成一个索引表,每一个索引项的结构:(索引,存放数据元素的地址)
* 缺点:既需要存放数据元素,也需要存放索引表。存放索引表会增加额外的开销。
3. 散列存储
* 散列存储也称为hash存储,是通过关键字的函数运算得到存放数据元素的地址
* 注意:
1. 数据的存储结构会影响对数据运算的速度。---比如想找到第三个人
2. 数据的存储结构会影响存储空间的方便程度。---有人想插队
1.2.3 数据的运算
2. 算法和算法评价
1. 算法:对特定问题求解步骤的一种描述,它是指令的有限序列,其中每条指令表示一个或多个操作。
2. 特点
1. 有穷性
2. 确定性
3. 可行性
4. 输入
5. 输出
* 记忆:可确有、输入、输出
3. 如何设计一个好算法
1. 正确性:算法应该能正确的解决问题
2. 可读性:算法应该具有良好的可读性,以便人们理解
3. 健壮性:输入非法数据时,算法能适应的做出反应或处理
4. 效率与存储量:效率指算法的执行时间;存储量指算法执行过程中所需要的最大存储空间。
2.1 算法效率的度量
2.1.1 大O记号:O(n)
由于我们关注的是足够大的问题,注重考察成本的增长趋势,O(n)用来定义最坏的趋势:
2.1.2 Ω记号:Ω(n)
2.1.3 θ记号:θ(n)
由于算法复杂度可以用空间补时间,而空间是可以突破的,所以更重要的是时间,这里空间复杂度就不做描述。
2.2 需要记住的几个结论
O(1) < O(logn) < O(n) < O(nlogn) < O(n²) < O(n³) < O(2ⁿ) < O(n!)
如果对于算法复杂度还是不太理解的可以看我的另一篇博客:https://blog.csdn.net/qq_43546676/article/details/105514353
3. 相关习题
3.1 概念相关题目
3.1.1 第1题
解释:要描述数据结构,必须满足数据结构的三要素。抽象数据类型的定义如下:
ADT 抽象数据类型名
{
Data:
数据元素之间逻辑关系的定义;
Operation:
操作1;
操作2;
…
}
一个ADT可以用三元组(数据对象、数据关系、基本操作集)。也就是定义了数据结构(此时不关心物理结构,物理结构的不同对应不同的数据结构)。
3.1.2 第2题
3.1.3 第3题
解释:A是线性结构在物理采用顺序存储。B是线性结构在物理采用散列存储。D是线性结构在物理采用链式存储。ABD即涉及了逻辑结构,又涉及了物理结构,不符合题意。而C有序表是指有序的线性表,是单纯的有序的线性结构。
3.1.4 第4题
选D
。
解释:选对答案应该没问题,可能对A有些疑惑。A的定义如下:循环队列是一种用顺序表实现的特殊队列。
3.1.5 第5题
选A
。
解释:主要是AB的问题。可以举一个例子,你父母争的钱是独立与你的,而你争的钱是不能独立于你的父母的。而某一种数据结构,我们是先确定其逻辑结构,再确定其物理结构,逻辑结构与物理结构是不相关的。所以逻辑结构独立于存储结构。
3.1.6 第6题
选C
。
解释:首先,这里的数据指的是数据结构中的数据,而数据结构的数据由两部分组成:数据对象和数据元素间的关系。存储数据元素等于存储数据对象,那么还剩下数据元素间的关系需要存储。另外,我们在使用链表的时候,有指针域指向下一个结点,不就是存储数据元素间一对一的关系吗。
AD都是属于数据操作,不是存储数据相关的;B是在申请内存的时候就已经隐式的表明了,不需要存储。
3.1.7 第7题
选A
。
解释:链式存储指的是节点间不连续,而结点的内部是连续的,这点通过我们平时定义结构体就可以看出来。
3.1.8 第8题
不一定相同。
解释:因为数据结构三要素是逻辑结构、物理结构、操作。逻辑结构、物理结构相同,而操作不同是不同的数据结构,比如二叉树和排序二叉树是两种不同的数据结构。所以是不一定相同。
3.1.8 第8题
比如顺序表和链表在删除元素和插入元素时的算法复杂度不一样,前者是O(n),后者是O(1).不记查找的时间,只是删除和插入的时间。
3.2 算法复杂度相关习题
3.2.1 第1题
解释:B算法的定义就是问题求解步骤的描述。A算法不等于程序,这都知道,因为程序可以是无穷的。C满足这五个特征的不一定是算法,而算法一定满足这5个特征。
3.2.2 第2题
选C
。
解释:问题规模指的是函数形参的规模,比如形参 nt n,问题的规模是n,算法复杂度是估算程序执行时间。而T(n) <= C * n^2,所以选C
3.2.3 第3题
选D
。
3.2.4 第4题
3.2.5 第5题
3.2.6 第6题
选D
。
解释:这个应该不难算出最坏的复杂度为O(m+n),而O(max(m,n)) = O(m+n),所以选D。
3.2.7 第7题
3.2.8 第8题
3.2.9 第9题
3.2.10 第10题
选D
。
3.2.11 第11题
3.2.12 第12题
选B
。
解释:算法原地工作是指O(1), 是常数个辅助空间。
3.2.13 第13题
答案logn
。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/84626.html