算法分析与设计基础
---
title: 算法分析与设计基础
tags: 小结
category: /小书匠/日记/2022-02
renderNumberedHeading: true
grammar_cjkRuby: true
---
欢迎使用 **{小书匠}(xiaoshujiang)编辑器**,您可以通过 `小书匠主按钮>模板` 里的模板管理来改变新建文章的内容。
# 目录:
[TOC]
# 算法分析与设计
## 算法基本概括
### 分析部分:
>1. **正确性证明**
>2. **循环不变量的应用**(Loop invariants)
>3. **动态规划、贪心等算法的正确性证明**
>4. **时间复杂度**
>5. **worst-case(输入最差)**
>6. **average-case(对输入的分布求期望)**:随机变量
>7. **expected-case(任意输入,对程序随机数发生器的输出求期望)**:随机变量
>8. **amortized analysis(输入最差,对不同操作求平均)**
>9. **递归时间复杂度分析**:主定理等方法
>10. **问题时间复杂度下界**:一个问题最好能做到多少(譬如基于比较的排序 [公式] )
### 设计部分:
>**问题求解**:针对一个问题,我们要学习如何定义解空间(定义数学问题)。算法的目的就是在解空间中找到满足条件的解。设计好的算法能帮助我们更快的找到解。这往往是通过对解空间(问题)的观察、理解帮助我们缩小解空间,套用学习过的算法
1. **枚举**:遍历(穷举)解空间寻找解。可以利用数学约束减小需要搜索的解空间,以好的次序遍历等方法优化
2. **搜索**:从解空间中一点出发,以特定的次序遍历结构化的解空间(如图)
3. **打表**:把(原问题或子问题)解空间中的部分结果保存下来,以空间换时间
4. **倍增**:保留 [公式] 处的值以快速构造所有的情况
5. **迭代**:从解空间中一点出发,保证每次都向解“靠近”,最终收敛到解
6. **递归**:将原问题规约到一个较小规模的问题上(甚至从规模 n 到规模 n-1,当然这可以用循环实现,这里的递归是数学上的设计而非需要栈帧的递归)以下的分治法、动归等都是在递归的基础上,基于解空间的特性设计的更好的方法
7. **递推**:从较小规模的问题出发,获得原问题的解。递推和递归可以比作综合法和分析法,动态规划的实现既可以用递归(记忆化搜索)也可以用递推(Bottom-up)
8. **分治**:将原问题规约到多个规模相近的问题上。首先划分(Divide),再用相同方法解决子问题(Conquer),最后合并子问题的答案获得(Merge)
9. **二分**:无需 Merge 的分治法,通常在划分的两个子问题空间中,原问题的解落在确定的一个子问题内部
10. **动态规划**:原问题的 最优 解可以由子问题的最优解组合而成(optimal sbustructure)。相比于分治,动态规划在每步采取不同的划分策略(make a decision)会导致不同的结果(快排在哪里划分不会影响正确性),程序上体现在最外层的循环。其优点在于可以避免反复求解相同的子问题(overlapping subproblem)
11. **贪心**:原问题的 最优 解可以通过局部最优的策略(decision)规约到一个较小规模的问题上。可以看做是在动态规划中存在一种最优的划分子问题的方案
图论算法:图的引入使为了更好的结构化问题,理解解空间,主要是利用上面的算法设计,针对不同的问题设计出的算法,不再展开
浙公网安备 33010602011771号