diff --git a/Algorithm/A类:基本算法/1 算法概述.md b/Algorithm/A类:基本算法/1 算法概述.md new file mode 100644 index 00000000..735dac06 --- /dev/null +++ b/Algorithm/A类:基本算法/1 算法概述.md @@ -0,0 +1,76 @@ +# 算法概述 + +## 1 基本概念 + +### 定义 +算法是一系列解决问题的清晰指令,对于符合一定规范的输入,算法能够在有限时间内获得所要求的输出。算法是解决问题的一种方法或过程,它是由若干条指令组成的有穷序列。 + +### 特征 +输入:有零或多个外部量作为算法的输入。 +输出:算法产生至少一个量作为输出。 +确定性:组成算法的每条指令清晰、无歧义。 +有效性:算法中执行的任何计算步骤都是可以被分解为基本的可执行的操作步。 +有限性:算法中每条指令的执行次数有限,执行每条指令的时间也有限。 + +### 算法的描述 +* 算法的描述方式:自然语言、流程图、伪代码 +* 算法的正确性证明方式:归纳法 +* 算法分析:正确性分析、效率分析、复杂度分析 + +## 2 求解流程 + +### 求解步骤 + +![](image/算法流程.png) + + +## 3 算法分类 + +### 面向算法范式 +> 这一个主要是我们算法课程中学习到的算法。用来解决基本具体的问题。 +* 蛮力法(暴力破解、枚举、穷举) +* 递归与分治法 +* 动态规划 +* 贪心算法 +* 回溯法 +* 分支限界法 +* 随机化算法 + +### 面向数据结构 +> 在数据结构部分处理,数据结构本身就是算法的一部分,用于处理特殊数据结构的额算法。 +* 堆栈算法 +* 树算法 +* 图算法 + +### 面向问题类型 +> 这些都是常见的问题类型。 +* 搜索 + * 广度优先搜索 + * 深度优先搜索 +* 排序 + * 选择排序 + * 冒泡排序 + * 快速排序 + * 桶排序 +* 查找 + * 顺序查找 + * 二分查找 + * 插值查找 + * 菲波那切查找 + * 树表查找 + * 分块查找 + * 哈希查找 +* 字符串处理 +* 排列组合 + * 任务分配 + * 背包问题 +* 集合问题 +* 数值问题 + + +### 智能算法 +> 更高级的算法。 + * 蚁群算法 + * 模拟退火算法 + * 遗传算法 + diff --git a/Algorithm/A类:基本算法/2 算法效率.md b/Algorithm/A类:基本算法/2 算法效率.md new file mode 100644 index 00000000..e1722fac --- /dev/null +++ b/Algorithm/A类:基本算法/2 算法效率.md @@ -0,0 +1,136 @@ +# 算法效率 + +> 目录 +1. 算法效率的度量 +2. 函数的渐进的界 +3. 算法的基本复杂性类型 +4. 算法复杂性分析的基本方法 +5. 非递归算法的复杂性分析 +6. 递归算法的复杂性分析 +7. 递归算法与非递归算法比较 +8. 经验分析方法 +9. 算法可视化 + + +## 1 算法效率的度量 + +### 分类 +* 时间效率 +* 空间效率 + +### 算法效率的表示 + +N-要解决问题的规模 +I-算法的输入 +A-算法本身 +C-算法复杂性 +S-空间复杂性 +T-时间复杂性 +$$ +C = F(N, I, A)\\ +T = T(N, I)\\ +S = S(N, I)\\ +$$ + +### 算法效率的界 +包含最大时间效率、最小时间效率、平均时间效率。 +![](image/时间效率的界.png) + + +## 2 函数的渐进的界 + +### 函数的界定义 +设f 和g 是定义域为自然数集N上的函数 + +1. $f(n)=O(g(n))$渐进上界 +若存在正数$c$和$n0$使得对一切$n≥n0有0≤f(n)≤cg(n)$ +2. $f(n)= Ω(g(n))$渐进下届 +若存在正数$c$和$n0$使得对一切$n≥n0有0≤cg(n)≤ f(n)$ +3. $f(n)=o(g(n))$ +对任意正数$c$存在$n0$使得对一切$n≥n0$有$0≤f(n)的某个性质,那么P(x1,x2,…,xi+1)真蕴含P(x1,x2,…,xi) 为真,即 +P(x1,x2,…,xi+1) → P(x1,x2,…,xi) (0 | 1 ≤ xi ≤N, 1 ≤ i ≤N}(解空间)之中。可将问题解空间表示为一定的结构,通过对解空间的搜索,得到满足要求的问题解。 + +### 回溯法的程序结构 + +* 递归回溯 +``` +void backtrack (int t) +{ + if (t>n) output(x); + else + for (int i=f(n,t);i<=g(n,t);i++) { + x[t]=h(i); + if (constraint(t)&&bound(t)) backtrack(t+1); + } +} +``` +* 迭代回溯 +``` +void iterativeBacktrack () +{ + int t=1; + while (t>0) { + if (f(n,t)<=g(n,t)) + for (int i=f(n,t);i<=g(n,t);i++) { + x[t]=h(i); + if (constraint(t)&&bound(t)) { + if (solution(t)) output(x); + else t++;} + } + else t--; + } +} +``` + +### 分支限界与回溯法对比 +* 求解目标不同:回溯法的求解目标是找出解空间树中满足约束条件的所有解。而分支限界的求解目标是找出满足约束条件的一个解。这个解可能是最优解。 +* 搜索方式不同:回溯法以深度优先的方式搜索解空间。而分支限界法则以广度优先或以最小消耗优先的方式搜索解空间。 diff --git a/Algorithm/A类:基本算法/8 分支限界.md b/Algorithm/A类:基本算法/8 分支限界.md new file mode 100644 index 00000000..43972bc6 --- /dev/null +++ b/Algorithm/A类:基本算法/8 分支限界.md @@ -0,0 +1,13 @@ +# 分支限界 + +## 1 概述 + +### 基本思想 + +在分支限界法中,每一个活结点只有一次机会成为扩展结点。活结点一旦成为扩展结点,就一次性产生其所有儿子结点。在这些儿子结点中,导致不可行解或导致非最优解的儿子结点被舍弃,其余儿子结点被加入活结点表中。 + +此后,从活结点表中取下一结点成为当前扩展结点,并重复上述结点扩展过程。这个过程一直持续到找到所需的解或活结点表为空时为止。 + +### 常见的两种分支界限法 +* 队列式(FIFO)分支限界法:按照队列先进先出(FIFO)原则选取下一个节点为扩展节点。 +* 优先队列式分支限界法:按照优先队列中规定的优先级选取优先级最高的节点成为当前扩展节点。 diff --git a/Algorithm/A类:基本算法/9 随机化.md b/Algorithm/A类:基本算法/9 随机化.md new file mode 100644 index 00000000..e69de29b diff --git a/Algorithm/A类:基本算法/image/函数界的基本性质.png b/Algorithm/A类:基本算法/image/函数界的基本性质.png new file mode 100644 index 00000000..b1ead133 Binary files /dev/null and b/Algorithm/A类:基本算法/image/函数界的基本性质.png differ diff --git a/Algorithm/A类:基本算法/image/排列问题复杂度.png b/Algorithm/A类:基本算法/image/排列问题复杂度.png new file mode 100644 index 00000000..08482c5e Binary files /dev/null and b/Algorithm/A类:基本算法/image/排列问题复杂度.png differ diff --git a/Algorithm/A类:基本算法/image/时间效率的界.png b/Algorithm/A类:基本算法/image/时间效率的界.png new file mode 100644 index 00000000..ea132c2b Binary files /dev/null and b/Algorithm/A类:基本算法/image/时间效率的界.png differ diff --git a/Algorithm/A类:基本算法/image/比较排序算法复杂度.png b/Algorithm/A类:基本算法/image/比较排序算法复杂度.png new file mode 100644 index 00000000..9fad0d92 Binary files /dev/null and b/Algorithm/A类:基本算法/image/比较排序算法复杂度.png differ diff --git a/Algorithm/A类:基本算法/image/矩阵乘法复杂度.png b/Algorithm/A类:基本算法/image/矩阵乘法复杂度.png new file mode 100644 index 00000000..5320ce0f Binary files /dev/null and b/Algorithm/A类:基本算法/image/矩阵乘法复杂度.png differ diff --git a/Algorithm/A类:基本算法/image/算法流程.png b/Algorithm/A类:基本算法/image/算法流程.png new file mode 100644 index 00000000..98e7c4fd Binary files /dev/null and b/Algorithm/A类:基本算法/image/算法流程.png differ diff --git a/Algorithm/A类:基本算法/image/递归算法复杂性1.png b/Algorithm/A类:基本算法/image/递归算法复杂性1.png new file mode 100644 index 00000000..211d2d04 Binary files /dev/null and b/Algorithm/A类:基本算法/image/递归算法复杂性1.png differ diff --git a/Algorithm/A类:基本算法/image/递归算法复杂性2.png b/Algorithm/A类:基本算法/image/递归算法复杂性2.png new file mode 100644 index 00000000..08d88951 Binary files /dev/null and b/Algorithm/A类:基本算法/image/递归算法复杂性2.png differ diff --git a/Algorithm/A类:基本算法/image/递归算法复杂性3.png b/Algorithm/A类:基本算法/image/递归算法复杂性3.png new file mode 100644 index 00000000..b8343839 Binary files /dev/null and b/Algorithm/A类:基本算法/image/递归算法复杂性3.png differ diff --git a/Algorithm/A类:基本算法/image/非递归算法复杂性分析.png b/Algorithm/A类:基本算法/image/非递归算法复杂性分析.png new file mode 100644 index 00000000..26ce35b0 Binary files /dev/null and b/Algorithm/A类:基本算法/image/非递归算法复杂性分析.png differ diff --git a/Algorithm/课程概要.md b/Algorithm/课程概要.md index e69de29b..2156371b 100644 --- a/Algorithm/课程概要.md +++ b/Algorithm/课程概要.md @@ -0,0 +1,9 @@ +# 课程概要 + +对于不同类别的算法说明。 + +* A类:基本算法 + +* B类:基于特殊数据结构的算法(图算法、树算法、堆栈算法)这一类应该属于数据结构部分。 + +* C类:特殊算法 \ No newline at end of file