绪论
数据结构的基本概念
基本概念和术语
-
数据(data)
数据是对客观事物的符号表示,在计算机科学中是指所有能输入到计算机中并被计算机程序处理的符号的总称。
-
数据元素
数据元素是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。
- 一个数据元素可以由若干个数据项构成
- 数据项是构成数据元素的不可分割的最小单位
-
数据对象
数据对象是性质相同的数据元素的集合,是数据的一个子集。
-
数据结构
数据结构是相互之间存在一种或多种特定关系的数据元素的集合
-
数据类型
数据类型是一个值的集合和定义再此集合上的一组操作的总称
-
原子类型
其值不可再分的数据类型
-
结构类型
其值可以再分解为若干份(分量)的数据类型
-
抽象数据类型
一个数学模型及定义在该数学模型上的一组操作
-
数据结构三要素
-
数据的逻辑结构
逻辑结构是指数据元素之间的逻辑关系,即从逻辑关系上描述数据
数据的逻辑结构分为
线性结构
和非线性结构
-
数据的存储结构
存储结构是指数据结构在计算机中的表示,也称物理结构
包括
数据元素的表示
和关系的表示
-
顺序存储
把逻辑上相邻的元素存储在物理位置上也相邻的存储单元中,元素之间的关系由存储单元的邻接关系来体现
- 优点:可以实现随机存取,每个元素占用最少的存储空间
- 缺点:只能使用相邻的一整块存储单元,因此可能产生较多的外部碎片
-
链式存储
不要求逻辑上相邻的元素在物理位置上也相邻,借助
指示元素
存储地址的指针
来表示元素之间的逻辑关系- 优点:不会出现碎片现象,能充分利用所有存储单元
- 缺点:每个元素因
存储指针
而占用额外的存储空间
,且只能实现顺序读取
-
索引存储
在存储元素信息的同时,还附加建立索引表。
- 优点:检索速度快,
- 缺点:附加的索引表额外占用存储空间。增加和删除数据时也要修改索引表,会花费较 多的时间
-
散列存储
哈希存储,根据元素的关键字直接计算出该元素的存储地址
- 优点:检索、增加和删除结点的操作都很快
- 缺点:若散列函数不好,可能出现元素存储单元的冲突,而解决冲突会增加时间和空间的开销
-
-
数据的运算
运算的定义和实现
- 运算的定义是针对逻辑结构的,指出运算的功能
- 运算的实现是针对存储结构的,指出运算的具体操作步骤
算法和算法评价
算法的基本概念
- 算法是对特定问题求解步骤的一种描述,他是
指令的有限序列
,其中的每条指令表示一个或多个操作
。
算法的五个重要特性
- 有穷性
- 确定性
- 可行性
- 输入
- 输出
一个好的算法应考虑达到以下目标
- 正确性
- 可读性
- 健壮性
- 高效率与低存储量需求
算法的效率度量
算法的效率度量是通过时间复杂度和空间复杂度来描述的
-
时间复杂度
- 语句频度:一个语句频度是指该语句在算法中被重复执行的次数
- T ( n ) T(n) T(n):算法中所有语句的频度之和记为 T ( n ) T(n) T(n),它是该算法问题规模 n n n的函数。
时间复杂度主要分析 T ( n ) T(n) T(n)的数量级
算法中
基本运算
(最深层循环中的语句)的频度于 T ( n ) T(n) T(n)同数量级,因此将算法中基本运算执行的次数的数量级作为该算法的时间复杂度T ( n ) = O ( f ( n ) ) T(n) = O(f(n)) T(n)=O(f(n))
取 f ( n ) f(n) f(n)中随 n n n增长最快的项,将其系数置为1作为时间复杂度的度量。如 f ( n ) = a n 3 + b n 3 + c n f(n) = an^{3}+bn^{3}+cn f(n)=an3+bn3+cn的时间复杂度为 O ( n 3 ) O(n^{3}) O(n3)
-
加法规则: T ( n ) = T 1 ( n ) + T 2 ( n ) = O ( f ( n ) ) + O ( g ( n ) ) = O ( m a x ( f ( n ) , g ( n ) ) ) T(n) = T_1(n)+T_2(n) = O(f(n)) + O(g(n)) = O(max(f(n),g(n))) 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(n) = T_1(n)*T_2(n) = O(f(n)) * O(g(n)) = O(f(n)*g(n)) T(n)=T1(n)∗T2(n)=O(f(n))∗O(g(n))=O(f(n)∗g(n))
-
常见的渐进时间复杂度为
O ( 1 ) < O ( l o g 2 n ) < O ( n ) < O ( n l o g 2 n ) < O ( n 2 ) < O ( n 3 ) < O ( 2 n ) < O ( n ! ) < O ( n n ) O(1)<O(log_2n)<O(n)<O(nlog_2n)<O(n^2)<O(n^3)<O(2^n)<O(n!)<O(n^n) 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的函数
S ( n ) = O ( g ( n ) ) S(n) = O(g(n)) S(n)=O(g(n)) -
算法原地工作时算法所需的辅助空间为常量, O ( 1 ) O(1) O(1)