绪论&复杂度分析
考纲内容
- 数据结构与算法的基本概念
- 算法复杂度的分析和计算
要求内容
- 理解数据结构与算法的基本概念
- 会分析和计算复杂度
- 思维导图索引
1.数据结构概念
- 数据结构是相互之间存在一种或多种特定关系数据元素的集合。
1.1 数据
- 数据是信息的载体
1.2 数据元素
- 数据元素是数据的基本单位
- 一个数据元素可由若干个数据项组成
- 数据项是构成数据元素的不可分割的最小单位
结构关系图如下:数据 > 数据对象 > 数据元素
1.3 数据类型
- 原子类型。其值不可再分的数据类型。如:int
- 结构类型。其值可以再分解成若干成分的数据类型。如:
struct
结构体 - 抽象数据类型。抽象数据组织与之相关的操作
1.4 数据结构
- 数据结构是相互之间存在一种或多种特定关系数据元素的集合
- 任何问题中,数据元素都不是孤立存在的,之间存在某种特定的关系,这种数据元素相互之间的关系称为结构
- 逻辑结构、存储结构、数据的运算
1.5 数据结构三要素
1.5.1 数据的逻辑结构
•从逻辑关系上描述·数据结构,与数据的存储无关
•逻辑结构分为线性结构和非线性结构
•典型的线性结构——线性表
•典型的非线性结构——集合、树、图
分类如下
- 集合:同属一个集合,别无其他关系,如图(a)
- 线性结构:结构中的数据元素只存在一对一关系,如图(b)
- 树形结构:结构中的数据元素存在一对多关系,如图©
- 图状或者网状结构:结构中的数据元素存在多对多关系,如图(d)
1.5.2 数据的存储结构
- 存储结构是数据结构在计算机中的表示(也称映像),又称物理结构。它包括数据元素的表示和关系的表示
- 数据的存储结构主要有顺序存储、链式存储、索引存储和散列存储
- 顺序存储
逻辑上相邻的元素存储在物理位置上也相邻的存储单元中,物理位置即信息在计算机中的位置,元素关系由存储单元的邻接关系体现
优点
可以实现随机存储,每个元素占最少的存储空间
缺点
只能使用相邻的一整块存储单元,如果存储连续的几个数据,可能会出现较多的未利用的空间
- 链式存储
不要求逻辑上相邻的元素在物理位置上也相邻,可以借助指示元素存储地址的指针来表示元素之间的逻辑关系
优点
不会出现碎片现象,能充分利用所有存储单元
缺点
每个元素因为存储指针而占用额外存储空间,没有上一个指针的地址找不到下一个,只能实现顺序存取
- 索引存储
在存储元素信息的同时,还建立附加的索引表,分别存放数据元素和元素间关系的存储方式,索引表每项称为索引项,索引项的一般形式是(关键字,地址)以后可以联系操作系统的文件系统章节来理解
优点
检索速度快
缺点
附加的索引表额外占用存储空间,增加和删除数据也要修改索引表,花费时间。
- 散列存储
根据元素的关键字直接计算出该元素的存储地址,又称哈希存储
优点
检索、增加、删除结点的操作都很快
缺点
若散列函数不好,可能会出现元素存储单元的冲突。而解决冲突会增加时间和空间的开销
1.5.3 数据的运算
包括运算的定义和实现。运算的定义是针对逻辑结构的,指出运算的功能。运算的实现是针对存储结构的,指出运算的具体操作步骤。
2. 算法的基本概念和评价
算法(Algorithm)是对特定问题求解步骤的一种描述,指令的有限序列,其中每一条指令表示一个或多个操作
2.1 算法的五个重要特性
- 有穷性
有限步骤后结束,每一步都可在有穷时间内完成
- 确定性
算法中每条指令必须有确切的含义,不存在二义性,即没有歧义
- 可行性
比如受限于计算机的计算能力,有些算法虽然理论上可行,但实际上无法完成。
- 输入
一个算法有一个或多个输入
- 输出
一个算法有一个或多个输出
此外设计一个好的算法应该还要考虑以下4个目标
(1)正确性:算法能够正确的解决求解问题
(2)可读性:算法具有良好的可读性,以便帮助理解
(3)健壮性:输入非法数据时,算法能适当的做出反应或处理,而不会产生莫名奇妙的结果
(4)效率与低存储量需求:效率指的是算法执行的时间,
存储量需求是指算法执行过程中所需要的最大存储空间,这两者都与问题的规模有关
2.2 算法的时间复杂度
所有语句的频度(执行次数)之和记为 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))例如 T ( n ) = n 2 + n + 1 , T ( n ) = O ( n 2 ) T(n)=n^2+n+1,T(n)=O(n^2) T(n)=n2+n+1,T(n)=O(n2)
则 O ( n 2 ) O(n^2) O(n2) 即为所求的复杂度
一般只考虑最坏情况下的时间复杂度,以保证算法的运行时间不会比它更长
- 加法规则
多项相加,只保留最高阶的项,且系数变为1
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 × T 2 ( n ) = O ( f ( n ) ) × O ( g ( n ) ) = O ( f ( n ) × g ( n ) ) T(n)= T_1×T_2~(n) = O(f(n)) × O(g(n)) = O(f(n)×g(n)) T(n)=T1×T2 (n)=O(f(n))×O(g(n))