|
|
|
@ -4,12 +4,31 @@
|
|
|
|
|
|
|
|
|
|
### 1.算法基本概念及5个特性
|
|
|
|
|
|
|
|
|
|
> 算法(algorithm)是对特定问题求解步骤的一种步骤,是指令的有限序列
|
|
|
|
|
|
|
|
|
|
算法必须满足下列5个重要特性:
|
|
|
|
|
|
|
|
|
|
+ **输入**:一个算法有**零个**或多个输入
|
|
|
|
|
+ **输出**:一个算法有**一个**或多个输出
|
|
|
|
|
+ **有穷性**:一个算法必须总是(对任意合法的输入)在执行有穷步后结束
|
|
|
|
|
+ **确定性**:算法的每一条指令必须有确切的含义,不存在二义性,并且在任何条件下对相同的输入总能得到相同的输出。
|
|
|
|
|
+ **可行性**:算法的描述的操作可以通过已经实现的基本操作执行有限次指令来实现。
|
|
|
|
|
|
|
|
|
|
### 2.算法的描述方法
|
|
|
|
|
|
|
|
|
|
+ 伪代码
|
|
|
|
|
自然语言通常用来粗略地描述算法的基本思想。
|
|
|
|
|
|
|
|
|
|
> **伪代码**是介于自然语言和程序设计语言之间的方法,它采用某一程序设计语言的基本语法,操作指令可以结合自然语言来设计。
|
|
|
|
|
|
|
|
|
|
### 3.算法设计的过程
|
|
|
|
|
|
|
|
|
|
+ 理解问题
|
|
|
|
|
+ 选择算法设计技术
|
|
|
|
|
+ 设计并描述算法
|
|
|
|
|
+ 手工运行算法
|
|
|
|
|
+ 分析算法的效率
|
|
|
|
|
+ 实现算法
|
|
|
|
|
|
|
|
|
|
#### 1.3 重要的问题类型
|
|
|
|
|
|
|
|
|
|
##### 1.3.3 图问题
|
|
|
|
@ -22,20 +41,55 @@
|
|
|
|
|
|
|
|
|
|
#### 2.1 算法的时间复杂性分析
|
|
|
|
|
|
|
|
|
|
最大影响:输入数据的规模
|
|
|
|
|
> **渐进分析**是指忽略具体机器、编程语言和编译器的影响,只关注在输入规模增大时算法运行时间的增长趋势。
|
|
|
|
|
|
|
|
|
|
+ 时间复杂度的计算
|
|
|
|
|
影响算法时间代价的最主要因素:输入数据的规模
|
|
|
|
|
|
|
|
|
|
##### 2.1.2 算法的渐进分析
|
|
|
|
|
|
|
|
|
|
+ 大O,Ω(平凡下界)
|
|
|
|
|
+ 大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()=
|
|
|
|
|
\left \{
|
|
|
|
|
\begin{array}{ll}
|
|
|
|
|
c,n=1\\
|
|
|
|
|
aT(n/b)+cn^k,n>1
|
|
|
|
|
\end{array}
|
|
|
|
|
\right.
|
|
|
|
|
$$
|
|
|
|
|
若T(n)是一个非递减函数,且满足通用分治递推式,则如下结果成立:
|
|
|
|
|
$$
|
|
|
|
|
T()=
|
|
|
|
|
\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 算法的空间复杂性分析
|
|
|
|
@ -52,6 +106,10 @@ P29 第四题
|
|
|
|
|
|
|
|
|
|
### 1.蛮力法的基本思想
|
|
|
|
|
|
|
|
|
|
**蛮力法**是一种简单直接地解决问题地方法,常常直接基于问题的描述。
|
|
|
|
|
|
|
|
|
|
蛮力法所依赖的基本技术是**遍历**,也称扫描。
|
|
|
|
|
|
|
|
|
|
### 2.具体问题中的应用
|
|
|
|
|
|
|
|
|
|
+ 查找问题:顺序
|
|
|
|
@ -59,8 +117,11 @@ P29 第四题
|
|
|
|
|
+ 串匹配
|
|
|
|
|
|
|
|
|
|
+ BF:朴素的模式匹配
|
|
|
|
|
|
|
|
|
|
+ KMP:主串无回溯(**求NEXT数组**,Page 40)
|
|
|
|
|
|
|
|
|
|
[如何更好地理解和掌握 KMP 算法? - 知乎 (zhihu.com)](https://www.zhihu.com/question/21923021)
|
|
|
|
|
|
|
|
|
|
+ 排序问题
|
|
|
|
|
|
|
|
|
|
+ 选择排序
|
|
|
|
|