|
|
|
|
*written by PeterAlbus,Copyright © 2021 - SHOU 1951123 Hong Wu*
|
|
|
|
|
|
|
|
|
|
# 第1-2章 绪论
|
|
|
|
|
|
|
|
|
|
### 1.算法基本概念及5个特性
|
|
|
|
|
|
|
|
|
|
> 算法(algorithm)是对特定问题求解步骤的一种步骤,是指令的有限序列
|
|
|
|
|
|
|
|
|
|
算法必须满足下列5个重要特性:
|
|
|
|
|
|
|
|
|
|
+ **输入**:一个算法有**零个**或多个输入
|
|
|
|
|
+ **输出**:一个算法有**一个**或多个输出
|
|
|
|
|
+ **有穷性**:一个算法必须总是(对任意合法的输入)在执行有穷步后结束
|
|
|
|
|
+ **确定性**:算法的每一条指令必须有确切的含义,不存在二义性,并且在任何条件下对相同的输入总能得到相同的输出。
|
|
|
|
|
+ **可行性**:算法的描述的操作可以通过已经实现的基本操作执行有限次指令来实现。
|
|
|
|
|
|
|
|
|
|
### 2.算法的描述方法
|
|
|
|
|
|
|
|
|
|
自然语言通常用来粗略地描述算法的基本思想。
|
|
|
|
|
|
|
|
|
|
> **伪代码**是介于自然语言和程序设计语言之间的方法,它采用某一程序设计语言的基本语法,操作指令可以结合自然语言来设计。
|
|
|
|
|
|
|
|
|
|
### 3.算法设计的过程
|
|
|
|
|
|
|
|
|
|
+ 理解问题
|
|
|
|
|
+ 选择算法设计技术
|
|
|
|
|
+ 设计并描述算法
|
|
|
|
|
+ 手工运行算法
|
|
|
|
|
+ 分析算法的效率
|
|
|
|
|
+ 实现算法
|
|
|
|
|
|
|
|
|
|
#### 1.3 重要的问题类型
|
|
|
|
|
|
|
|
|
|
##### 1.3.3 图问题
|
|
|
|
|
|
|
|
|
|
+ TSP问题
|
|
|
|
|
|
|
|
|
|
##### 1.3.4 组合问题
|
|
|
|
|
|
|
|
|
|
### 4.算法复杂度分析:**时间**/空间
|
|
|
|
|
|
|
|
|
|
#### 2.1 算法的时间复杂性分析
|
|
|
|
|
|
|
|
|
|
> **渐进分析**是指忽略具体机器、编程语言和编译器的影响,只关注在输入规模增大时算法运行时间的增长趋势。
|
|
|
|
|
|
|
|
|
|
影响算法时间代价的最主要因素:输入数据的规模
|
|
|
|
|
|
|
|
|
|
##### 2.1.2 算法的渐进分析
|
|
|
|
|
|
|
|
|
|
+ 大O
|
|
|
|
|
|
|
|
|
|
> 若存在两个正的常数$c$和$n_0$,对于任意$n \geq n_0$,都由$T(n) \leq c \times f(n)$,则称$T(n)=O(f(n))$
|
|
|
|
|
|
|
|
|
|
大O用来描述增长率的上限,表示$T(n)$的增长最多像$f(n)$增长的那样快。
|
|
|
|
|
|
|
|
|
|
+ Ω(平凡下界)
|
|
|
|
|
|
|
|
|
|
> 对问题的输入中必须要处理的元素进行计数,同时对必须要输出的元素进行计数。
|
|
|
|
|
|
|
|
|
|
平凡下界反映了完成算法必须要完成的时间复杂度。平凡下界往往因为过小而失去意义。
|
|
|
|
|
|
|
|
|
|
##### 2.1.3 最好、最坏和平均情况
|
|
|
|
|
|
|
|
|
|
有的问题即使输入规模相同,但如果输入的数据不同,其时间复杂度也不同。这时就会分为最好、最坏和平均情况。
|
|
|
|
|
|
|
|
|
|
##### 2.1.5 递归算法的时间复杂性分析
|
|
|
|
|
|
|
|
|
|
**定理2.1(考)** 使用主定理计算时间复杂度
|
|
|
|
|
|
|
|
|
|
递归算法通常满足如下通用分治递推式:
|
|
|
|
|
$$
|
|
|
|
|
T(n)=
|
|
|
|
|
\left \{
|
|
|
|
|
\begin{array}{ll}
|
|
|
|
|
c,n=1\\
|
|
|
|
|
aT(n/b)+cn^k,n>1
|
|
|
|
|
\end{array}
|
|
|
|
|
\right.
|
|
|
|
|
$$
|
|
|
|
|
若T(n)是一个非递减函数,且满足通用分治递推式,则如下结果成立:
|
|
|
|
|
$$
|
|
|
|
|
T(n)=
|
|
|
|
|
\left \{
|
|
|
|
|
\begin{array}{ll}
|
|
|
|
|
O(n^{log_bn}),a>b^k\\
|
|
|
|
|
O(n^klog_bn),a=b^k\\
|
|
|
|
|
O(n^k),a<b^k
|
|
|
|
|
\end{array}
|
|
|
|
|
\right.
|
|
|
|
|
$$
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
P29 第四题
|
|
|
|
|
|
|
|
|
|
#### 2.2 算法的空间复杂性分析
|
|
|
|
|
|
|
|
|
|
1. 输入输出数据占用的空间
|
|
|
|
|
|
|
|
|
|
2. 算法本身占用的空间
|
|
|
|
|
|
|
|
|
|
3. 执行算法需要的辅助空间
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 第3章 蛮力法
|
|
|
|
|
|
|
|
|
|
### 1.蛮力法的基本思想
|
|
|
|
|
|
|
|
|
|
**蛮力法**是一种简单直接地解决问题地方法,常常直接基于问题的描述。
|
|
|
|
|
|
|
|
|
|
蛮力法所依赖的基本技术是**遍历**,也称扫描。
|
|
|
|
|
|
|
|
|
|
### 2.具体问题中的应用
|
|
|
|
|
|
|
|
|
|
+ 查找问题:顺序
|
|
|
|
|
|
|
|
|
|
+ 串匹配
|
|
|
|
|
|
|
|
|
|
+ BF:朴素的模式匹配
|
|
|
|
|
|
|
|
|
|
+ KMP:主串无回溯(**求NEXT数组**,Page 40)
|
|
|
|
|
|
|
|
|
|
[如何更好地理解和掌握 KMP 算法? - 知乎 (zhihu.com)](https://www.zhihu.com/question/21923021)
|
|
|
|
|
|
|
|
|
|
+ 排序问题
|
|
|
|
|
|
|
|
|
|
+ 选择排序
|
|
|
|
|
+ 冒泡排序
|
|
|
|
|
|
|
|
|
|
考试方法:给定序列,经过n次xx排序后的序列,选择题
|
|
|
|
|
|
|
|
|
|
+ 组合问题: 生成排列/生成子集/任务分配/0-1背包问题
|
|
|
|
|
|
|
|
|
|
+ 图问题:哈密尔顿回路/TSP
|
|
|
|
|
|
|
|
|
|
+ ~~几何问题:最近对~~ 简单了解
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 第4章 分治法
|
|
|
|
|
|
|
|
|
|
### 1.分治法的基本思想
|
|
|
|
|
|
|
|
|
|
+ 步骤:划分->求解子问题->合并
|
|
|
|
|
+ 递归
|
|
|
|
|
+ 时间复杂度
|
|
|
|
|
|
|
|
|
|
### 2.具体问题中的应用
|
|
|
|
|
|
|
|
|
|
+ 排序问题
|
|
|
|
|
+ 归并排序
|
|
|
|
|
+ 快速排序
|
|
|
|
|
+ 组合问题:最大子段和,棋盘覆盖,循环赛日程安排
|
|
|
|
|
+ 几何问题:最近对
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 第5章 减治法
|
|
|
|
|
|
|
|
|
|
### 1.减治法的基本思想
|
|
|
|
|
|
|
|
|
|
+ 时间复杂度
|
|
|
|
|
|
|
|
|
|
### 2.具体问题中的应用
|
|
|
|
|
|
|
|
|
|
+ 查找问题
|
|
|
|
|
+ 折半查找
|
|
|
|
|
+ 二叉查找树
|
|
|
|
|
+ 排序问题
|
|
|
|
|
+ **堆排序**:筛选法
|
|
|
|
|
+ 组合问题:淘汰赛冠军、假币问题
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 第6章 动态规划法 -编程题
|
|
|
|
|
|
|
|
|
|
### 1.动态规划法的基本思想
|
|
|
|
|
|
|
|
|
|
+ 最优化问题:约束条件/可行解/目标函数
|
|
|
|
|
+ 适用问题、步骤
|
|
|
|
|
+ 与分治法的异同点
|
|
|
|
|
|
|
|
|
|
### 2.具体问题中的应用
|
|
|
|
|
|
|
|
|
|
+ 图问题
|
|
|
|
|
+ TSP问题(Page 108)
|
|
|
|
|
+ 多段图的最短路径
|
|
|
|
|
+ 组合问题
|
|
|
|
|
+ 0/1背包问题
|
|
|
|
|
+ 最长公共子序列问题
|
|
|
|
|
+ 查找问题
|
|
|
|
|
+ 最优二叉查找树
|
|
|
|
|
+ 矩阵快速幂->斐波那契数列
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 第7章 贪心法
|
|
|
|
|
|
|
|
|
|
### 1.贪心法的基本思想
|
|
|
|
|
|
|
|
|
|
### 2.具体问题中的应用
|
|
|
|
|
|
|
|
|
|
+ 图问题
|
|
|
|
|
+ TSP问题、图着色问题、最小生成树
|
|
|
|
|
+ 组合问题
|
|
|
|
|
+ 背包问题,活动安排
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 第8章 回溯法
|
|
|
|
|
|
|
|
|
|
### 1.回溯法的基本思想
|
|
|
|
|
|
|
|
|
|
+ 解空间树
|
|
|
|
|
+ 深度优先搜索
|
|
|
|
|
+ 剪枝函数
|
|
|
|
|
|
|
|
|
|
### 2.具体问题中的应用(解空间树的搜索)
|
|
|
|
|
|
|
|
|
|
+ 图问题
|
|
|
|
|
+ 图着色问题
|
|
|
|
|
+ 组合问题
|
|
|
|
|
+ 八皇后问题
|
|
|
|
|
|
|
|
|
|
# 第9章 分支限界法
|
|
|
|
|
|
|
|
|
|
### 1.分支限界法的基本思想
|
|
|
|
|
|
|
|
|
|
+ 解空间树
|
|
|
|
|
+ 广度优先搜素
|
|
|
|
|
+ 限界函数
|
|
|
|
|
|
|
|
|
|
### 2.具体问题中的应用(解空间树)
|
|
|
|
|
|
|
|
|
|
+ 图问题
|
|
|
|
|
+ TSP
|
|
|
|
|
+ 多段图最短路径
|
|
|
|
|
+ 组合问题
|
|
|
|
|
+ 0/1背包问题 p180 图9.9
|
|
|
|
|
|
|
|
|
|
# 第10、11、12章
|
|
|
|
|
|
|
|
|
|
4分,近似算法、概率算法(舍伍德、拉斯维加斯、蒙特卡罗),特点、适用场景
|