数据结构1-以前懵懂的算法复杂度,数据结构体系,现在全懂啦!吐血总结一波,还有一些考试相关的题目分享。

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)

Ω(n)用来定义最好的趋势:
在这里插入图片描述

2.1.3 θ记号:θ(n)

Ω(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题

在这里插入图片描述
D

解释:要描述数据结构,必须满足数据结构的三要素。抽象数据类型的定义如下:

ADT 抽象数据类型名
{
Data:
数据元素之间逻辑关系的定义;
Operation:
操作1;
操作2;

}
一个ADT可以用三元组(数据对象、数据关系、基本操作集)。也就是定义了数据结构(此时不关心物理结构,物理结构的不同对应不同的数据结构)。

3.1.2 第2题

在这里插入图片描述
A

3.1.3 第3题

在这里插入图片描述
C

解释: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

解释: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题

在这里插入图片描述
A

3.2.5 第5题

在这里插入图片描述
B

3.2.6 第6题

在这里插入图片描述

D

解释:这个应该不难算出最坏的复杂度为O(m+n),而O(max(m,n)) = O(m+n),所以选D。

3.2.7 第7题

在这里插入图片描述
C

3.2.8 第8题

在这里插入图片描述
B

3.2.9 第9题

在这里插入图片描述
C

3.2.10 第10题

在这里插入图片描述

D

3.2.11 第11题

在这里插入图片描述
A

3.2.12 第12题

在这里插入图片描述

B

解释:算法原地工作是指O(1), 是常数个辅助空间。

3.2.13 第13题

在这里插入图片描述

答案logn

解释:
在这里插入图片描述

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ElegantCodingWH

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值