绪论
- 一、基本概念
- 1、术语概念
- (1)数据
- 信息载体
- 描述客观事物属性的…符号集合
- 程序加工的原料
- (2)数据元素
- 数据的基本单位
- 整体处理
- 若干数据项组成,数据项是元素的 最小单位
- (3)数据对象
- 数据元素的集合
- 数据的子集
- (4)数据类型
- 一个值的集合和定义在此集合上一系列操作的总称
- 类型
- 原子类型:值不可再分
- 结构类型:值可再分若干成分
- 抽象数据类型:抽象数据组织及相关操作
- (5)数据结构
- 数据结构:相互存在特定关系的数据元素的集合
- 结构:数据元素之间的相互关系
- (1)数据
- 2、数据结构三要素:
-
(1)逻辑结构:
- 数据元素之间的逻辑关系,算法 设计 的决定因素
- 主要分为线性和非线性两大类
-
(2)存储(物理)结构:
- 数据结构(元素和关系)在计算机的表示(映像),用计算机语言实现的逻辑结构,算法 实现 的依赖因素
- #错题 栈是一种抽象数据类型,可采用顺序存储或链式存储,只表示逻辑结构。
- 分类:
- 顺序存储
- 特点:逻辑和物理位置均相邻
- 优点:可 随机存储 ,且元素占用最少存储空间
- 缺点:只使用一整块相邻存储单元,可能产生较多外部碎片
- 链式存储
- 特点:不要求物理相邻,指针表示关系
- 优点:无碎片现象
- 缺点:指针占用额外空间,只能 顺序存取
- #错题 链式存储设计时,各个不同结点的存储空间可以不连续,但 结点内的存储单元(值域和指针域) 地址必须连续。
- 索引存储
- 特点:附加索引表,索引项(形式:关键字+地址)
- 优点:速度快
- 缺点:索引表占额外空间,增删需改表占额外时间
- 散列(哈希)存储
- 特点:关键字计算存储地址
- 优点:检索、增删结点操作较快
- 缺点:散列函数不好的情况下会出现存储单元冲突,解决需额外时间成本
- 顺序存储
- 数据结构(元素和关系)在计算机的表示(映像),用计算机语言实现的逻辑结构,算法 实现 的依赖因素
-
(3)数据运算
- 运算定义针对逻辑结构→功能
- 运算实现针对存储结构→操作步骤
-
- 1、术语概念
- 二、算法和算法评价
- 1、算法概念
- (1)定义
- 问题求解步骤的描述 ,是指令的有限序列,每个指令可有多个操作
- #错题 算法代表对问题求解步骤的描述,而程序则是算法在计算机上的特定实现
- 问题求解步骤的描述 ,是指令的有限序列,每个指令可有多个操作
- (2)五个特征
- 有穷性:有穷步,每步时间有穷
- 确定性:指令含义确定,同输入得同输出
- 可行性:可通过已实现有限次基本操作实现
- 输入
- 输出
- (3 )“好”算法的标准
- 正确性
- 可读性
- 健壮性:可及时处理非法输入,无不合理输出
- 效率与低存储量需求:与问题规模有关
- (1)定义
- 2、效率度量
-
时间复杂度和空间复杂度
- (1)时间复杂度
- ① 相关概念
- 频度:语句被重复执行次数
- 算法问题规模函数T(n):所有语句频度之和
- 最深层循环内语句(基本运算)的频度为 f(n)
- f(n) 和T(n) 同数量级
- ② 时间复杂度:T(n) = O(f(n))
- ③ T(n) 依赖于
- 问题规模n
- 输入数据的性质(如初始状态)
- ④ 一般算法的时间复杂度是:最坏时间复杂度
- 其他:
- 平均时间复杂度:算法期望运行时间,所有输入示例等概率出现情况下
- 最好时间复杂度
- 其他:
- ⑤ 分析规则
- 加法:T(n) = O (max (f(n), g(n)) )
- 乘法:T(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(1)<O(\log_2n)<O(n)<O(n\log_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)
- #技巧 ⑦ 特定的T(n) 求解
- a、嵌套for循环
- f o r ( i = 1 ; i < = n ; i + + ) f o r ( j = 1 ; j < = i ; j + + ) f o r ( k = 1 ; k < = j ; k + + ) x + + ; { for }(i=1 ; i<=n ; i++) \\ \quad{ for }(j=1 ; j<=i ; j++) \\ \quad\quad{ for }(k=1 ; k<=j ; k++) \\ \quad\quad\quad x++; for(i=1;i<=n;i++)for(j=1;j<=i;j++)for(k=1;k<=j;k++)x++;
- 计算:
T
(
n
)
=
O
(
∑
i
=
1
n
∑
j
=
1
i
∑
k
=
1
j
1
)
=
O
(
∑
i
=
1
n
i
(
i
+
1
)
2
)
=
O
(
1
6
n
3
)
=
O
(
n
3
)
T(n)=O\left(\sum_{i=1}^{n} \sum_{j=1}^{i} \sum_{k=1}^{j} 1\right)=O\left(\sum_{i=1}^{n} \frac{i(i+1)}{2}\right)=O(\frac{1}{6}n^3)=O(n^3)
T(n)=O(∑i=1n∑j=1i∑k=1j1)=O(∑i=1n2i(i+1))=O(61n3)=O(n3)
- ∑ i = 1 n i ( i + 1 ) 2 = 1 2 ( ∑ i = 1 n i 2 + ∑ i = 1 n i ) \sum_{i=1}^{n} \frac{i(i+1)}{2}=\frac{1}{2}(\sum_{i=1}^{n} i^2+\sum_{i=1}^{n} i) ∑i=1n2i(i+1)=21(∑i=1ni2+∑i=1ni)
- ∑ n 2 = n ( n + 1 ) ( 2 n + 1 ) 6 \sum n^{2}=\frac{n(n+1)(2 n+1)}{6} ∑n2=6n(n+1)(2n+1)
- b、递归程序一般使用公式进行递推
- 递归算法方程: T ( n ) = { 1 , n = 1 2 T ( n / 2 ) + n , n > 1 T(n)=\left\{\begin{array}{ll}1, & n=1 \\2 T(n / 2)+n, & n>1\end{array}\right. T(n)={1,2T(n/2)+n,n=1n>1 ,假设n是2的整次幂
- 设 n = 2 k ( k ≥ 0 ) n=2^k(k≥0) n=2k(k≥0) ,有 T ( 2 k ) = 2 T ( 2 k − 1 ) + 2 k = 2 2 T ( 2 k − 2 ) + 2 × 2 k T\left(2^{k}\right)=2 T\left(2^{k-1}\right)+2^{k}=2^{2} T\left(2^{k-2}\right)+2 \times 2^{k} T(2k)=2T(2k−1)+2k=22T(2k−2)+2×2k
- 一般递推公式: T ( 2 k ) = 2 i T ( 2 k − i ) + i × 2 k T\left(2^{k}\right)=2^{i} T\left(2^{k-i}\right)+i \times 2^{k} T(2k)=2iT(2k−i)+i×2k
- 进而 T ( 2 k ) = 2 k T ( 2 0 ) + k × 2 k = ( k + 1 ) 2 k T(2^k)=2^kT(2^0)+k\times 2^k=(k+1)2^k T(2k)=2kT(20)+k×2k=(k+1)2k
- T ( n ) = 2 log 2 n + log 2 n × n = n ( log 2 n + 1 ) = O ( n log 2 n ) T(n)=2^{\log_2n}+\log_2n\times n=n(\log_2n+1)=O(n\log_2n) T(n)=2log2n+log2n×n=n(log2n+1)=O(nlog2n)
- a、嵌套for循环
- ① 相关概念
- (2)空间复杂度
- ① 空间复杂度:S(n) = O(g(n))
- 算法所费存储空间,取决于问题本身,与算法无关
- 指令、常数、变量和输入数据外+辅助空间(额外)
- 算法所费存储空间,取决于问题本身,与算法无关
- ① 空间复杂度:S(n) = O(g(n))
- (1)时间复杂度
- 1、算法概念