01 绪论
涉及数据结构相关概念和术语、数据结构的三要素(逻辑结构、物理结构、数据运算)、时间复杂度和空间复杂度的计算
数据结构的基本概念
基本概念和术语:
- 数据:数据是信息的载体,是客观事物属性的数、字符及所能输入到计算计并处理识别的符号的集合。
- 数据元素:是数据的基本单元,通常作为一个整体进行考虑处理。
- 数据项:是数据元素的不可分割的最小单位
- 数据对象:具有相同性质的数据元素的集合
- 数据类型:
- 原子类型:其值不可再分的数据类型
- 结构类型:其值可以再分解为若干成分的数据类型
- 抽象数据类型:抽象数据组织及与之相关的操作
- 抽象数据类型(ADT):是指一个数学模型及定义在该模型上的一组操作
- 数据结构:
- 数据元素之间的相互关系称为结构(Structure)
- 数据结构是相互之间存在的一种或多种特点关系的数据元素的集合。
- 主要包含三个方面(数据结构的三要素):
- 逻辑结构:算法的设计取决于所选取的逻辑结构
- 存储结构:算法的实现取决于所采用的存储结构
- 数据的运算:施加在数据上的运算包括运算的定义与实现,其中定义是针对逻辑结构,指出运算的功能;实现是针对存储结构,指出运算的具体操作步骤。
结构三要素
- 逻辑结构细化:
- 集合:数据元素同属于一个集合
- 线性结构:数据元素存在一对一的关系
- 非线性结构:
- 树装结构:数据元素之间存在一对多的关系
- 图装结构/网状结构:数据元素之间存在多对多的关系
- 存储结构细化:
- 顺序存储:可以随机存取,但是只能使用一整块存储单元,可能产生较多的外部碎片。
- 链式存储:不产出外部碎片,但是指针额外占用存储空间并且只能顺序存取
- 索引存储:检索速度快,但是增加附加的索引表会占用较多的存储空间并且增加(删除)数据时要修改索引表
- 散列存储:可以快速增删查改、但如果散列函数不好,则可能出现存储单元冲突(解决冲突会增加时间和空间的开销)
- 数据的运算:施加在数据上的运算包括运算的定义与实现,其中定义是针对逻辑结构,指出运算的功能;实现是针对存储结构,指出运算的具体操作步骤
算法和算法的评价
算法的基本概念
- 算法:是对特定问题求解步骤的一种描述,它的指令是有限序列、其中的每条指令表示一个或多个操作。
- 有穷性:一个算法总是在执行有限步之后结束,并且每一步都可在有穷时间内完成
- 确定性:每条指令必须有确定的含义,不会产生二义性(同样的输出得到同样的结果)
- 可行性:一个算法是可行的,即算法中描述的操作都是可以通过已经实现的基本运算执行有限次来实现。
- 输入:一个算法有零个或者多个输入
- 输出:一个算法有零个或者多个输出
- 算法设计目标:结合算法的五大特征,可以进一步得出算法的设计思路
- 正确性:算法能够正确的解决问题
- 可读性:算法具有良好的可读性
- 健壮性:输入非法数据时,能够很好的处理
- 效率与低存储量需求:算法的时间和空间成本要控制好
算法效率的度量(重点)
-
时间复杂度: 表示算法被重复执行的步数
-
算法时间复杂度记为: T(n)=O(f(n)){T(n) = O(f(n))}T(n)=O(f(n))
- O{O}O 表示为 T(n){T(n)}T(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(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)=T1(n)×T2(n)=O(f(n))×O(g(n))=O(f(n)×g(n)){T(n) = T_{1}(n) \times T_{2}(n)} = O(f(n)) \times O(g(n)) = O(f(n) \times g(n))T(n)=T1(n)×T2(n)=O(f(n))×O(g(n))=O(f(n)×g(n))
-
常见的渐近时间复杂度为:O(1)<O(log2n)<O(n)<O(nlog2n)<O(n2)<O(n3)<O(2n)<O(n!)<O(nn)O(1)<O(log_{2}n)<O(n)<O(nlog_{2}n)<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)=O(g(n))S(n) = O(g(n))S(n)=O(g(n))
- 算法原地工作:算法所需的辅助空间为常量,即 O(1)O(1)O(1)