数据结构笔记 Chap1—绪论
1.1 数据结构的基本概念
1.1.1 基本概念
数据
数据是信息的载体,是描述客观事物属性的数、字符及所有能输入到计算机中并被计算机程序识别和处理的符号的集合
数据元素
数据元素是数据的基本单位,通常作为一个整体进行考虑和处理
一个数据元素可又若干数据项组成,数据项是构成数据元素的不可分割的最小单位
数据对象
数据对象是具有相同性质的数据元素的集合,是数据的一个子集
概念范围大小的比较
数据
>
数据对象
>
数据元素
>
数据项
数据 > 数据对象 > 数据元素 > 数据项
数据>数据对象>数据元素>数据项
数据类型
数据类型是一个值的集合和定义在此集合上此集合上的一组操作的总称
-
原子类型
原子类型的值不可分解
-
结构类型
其值可以再分解为若干成分(分量)的数据类型
-
抽象数据类型(ADT)
一个数学模型及定义在该数学模型上一组操作,它通常是对数据的某种抽象,定义了数据的取值范围及其结构形式,以及对数据操作的集合
数据结构
数据结构是相互之间存在一种或多种特定关系的数据元素的集合
数据元素之间存在某种关系,这种数据元素相互之间的关系称为结构,根据元素之间关系的不同特性,通常有下列4类基本结构:
- 集合
- 线性结构
- 树形结构
- 图状结构或网状结构
1.1.2 数据结构的三要素
数据的逻辑结构
逻辑结构是指数据元素之间的逻辑关系,即从逻辑关系上描述数据
它与数据的存储无关,是独立于计算机的
逻辑结构的分类
数据的逻辑结构分类图
逻辑结构大致可分为以下4种
-
集合
结构中的数据元素之间除"同属一个集合"外,别无其它关系
-
线性结构
结构中的数据元素之间只存在一对一的关系
-
树形结构
结构中的数据元素之间存在一对多的关系
-
图状结构或网状结构
结构中的数据元素之间存在多对多的关系
数据的存储结构
存储结构是指数据结构在计算机中的表示(又称映像),也称物理结构
数据的存储结构包括数据元素的表示和关系的表示
数据的存储结构是使用计算机语言实现的逻辑结构,依赖于计算机语言
数据的存储结构通常分为4类
- 顺序存储
- 链式存储
- 索引存储
- 散列存储
数据的运算
施加在数据上的运算包括运算的定义和实现
- 运算的定义是针对逻辑结构的,指出运算的功能
- 运算的实现是针对存储结构的,指出运算的具体操作步骤
注意
-
若采用顺序存储,则各个数据元素在物理上必须是连续的
若采用非顺序存储,则各个数据元素在物理上离散的
-
数据的存储结构会影响空间分配的方便程度
-
数据的存储结构会影响对数据运算的速度
1.2 算法和算法评价
1.2.1 算法的基本概念
算法(Algorithm)是对特定问题求解步骤的一种描述,它是指令的有限序列,其中每一条指令表示一个或多个操作
算法的5个重要特性
-
有穷性
一个算法必须总是(对任何合法的输入值)在执行有穷步之后结束,且每一步都可在有穷时间内完成
程序可以是无穷的
-
确定性
算法中每条指令必须有确切的含义,对于相同的输入只能得出相同的输出
-
可行性
算法中描述的操作都可以通过已经实现的基本运算执行有限次来实现
-
输入
一个算法有零个或多个输入,这些输入取自于某个特定的对象的集合
-
输出
一个算法有一个或多个输出,这些输出是与输入有着某种特定关系的量
算法设计的要求
通常设计一个"好"的算法应考虑达到以下目标
-
正确性(correctness)
算法应当满足具体问题的需求
-
可读性(readability)
算法应具有良好的可读性,以帮助人们理解
-
健壮性(robustness)
算法能对输入的非法数据做出反应或处理,而不会产生莫名其妙的输出
-
高效率与低存储量需求
效率是指算法执行的时间,存储量需求是指算法执行过程中所需要的最大存储空间,这两者都与问题的规模有关
1.2.2 算法效率的度量
算法效率的度量是通过时间复杂度和空间复杂度来描述的
时间复杂度
一个语句的频度是指该语句在算法中被重复执行的次数
算法中所有语句的频度之和记为 T ( n ) T(n) T(n)
一般情况下,算法中基本操作的频度是问题规模
n
n
n 的某个函数
f
(
n
)
f(n)
f(n),算法的时间量度记作
T
(
n
)
=
O
(
f
(
n
)
)
T \left ( n \right ) = O \left ( f \left ( n \right ) \right )
T(n)=O(f(n))
它表示随问题规模问题规模
n
n
n 的增大,算法执行时间的增长率和
f
(
n
)
f \left ( n \right )
f(n) 的增长率相同,称作算法的时间复杂度
上式中 O O O 的含义是 T ( n ) T \left ( n \right ) T(n) 的数量级
算法的时间复杂度不仅依赖于问题的规模 n n n ,也取决于待输入数据的性质(如输入数据元素的初始状态)
最坏时间复杂度是指在最坏情况下,算法的时间复杂度
平均时间复杂度是指所有可能输入实例在等概率出现的情况下,算法的期望运行时间
最好时间复杂度是指在最好情况下,算法的时间复杂度
一般总是考虑在最坏情况下的时间复杂度,以保证算法的运行时间不会比它更长
计算规则
在分析一个程序的时间复杂度时,有以下两条规则
-
加法规则
T ( n ) = T 1 ( n ) + T 2 ( n ) = O ( f ( n ) ) + O ( g ( n ) ) = O ( max ( f ( n ) , g ( n ) ) ) T \left ( n \right ) = T _{1} \left ( n \right ) + T _{2} \left ( n \right ) = O \left ( f \left ( n \right ) \right ) + O \left ( g \left ( n \right ) \right ) = O \left ( \max \left ( f \left ( n \right ) , g \left ( n \right ) \right ) \right ) T(n)=T1(n)+T2(n)=O(f(n))+O(g(n))=O(max(f(n),g(n))) -
乘法规则
T ( n ) = T 1 ( n ) × T 2 ( n ) = O ( f ( n ) ) × O ( g ( n ) ) = O ( f ( n ) × g ( n ) ) T \left ( n \right ) = T _{1} \left ( n \right ) \times T _{2} \left ( n \right ) = O \left ( f \left ( n \right ) \right ) \times O \left ( g \left ( n \right ) \right ) = O \left ( f \left ( n \right ) \times g \left ( n \right ) \right ) T(n)=T1(n)×T2(n)=O(f(n))×O(g(n))=O(f(n)×g(n))
常见的时间复杂度有
O
(
1
)
<
O
(
log
2
n
)
<
O
(
n
)
<
O
(
n
log
2
n
)
<
O
(
n
2
)
<
O
(
n
3
)
<
O
(
2
n
)
<
O
(
n
!
)
<
O
(
n
n
)
O \left ( 1 \right ) < O \left ( \log_{2}{n} \right ) < O \left ( n \right ) < O \left ( n \log_{2}{n} \right ) < O \left ( n^{2} \right ) < O \left ( n^{3} \right ) < O \left ( 2^{n} \right ) < O \left ( n ! \right ) < O \left ( n^{n} \right )
O(1)<O(log2n)<O(n)<O(nlog2n)<O(n2)<O(n3)<O(2n)<O(n!)<O(nn)
空间复杂度
算法的空间复杂度
S
(
n
)
S(n)
S(n) 定义为该算法所需的存储空间,它是问题规模
n
n
n 的函数,记为
S
(
n
)
=
O
(
f
(
n
)
)
S \left ( n \right ) = O \left ( f\left ( n \right ) \right )
S(n)=O(f(n))
若输入数据所占空间只取决于问题本身,和算法无关,则只需要分析除输入和程序之外的额外空间
算法原地工作是指算法所需的辅助空间为常量,即 O ( 1 ) O(1) O(1)
参考书目
- 严蔚敏,吴伟民. 数据结构(C语言版)
- 王道论坛. 2025年数据结构考研复习指导