算法设计与分析
1.递归与分治
-
分治法
-
分治法产生的子问题是原问题的较小规模;
-
反复应用分治手段,可以使子问题规模不断缩小;
-
最终使子问题缩小到很容易直接求出其解;
-
将规模较小的问题的答案逐级向上合并,可得大问题答案。
-
-
分治法解决问题通常使用递归算法;
-
直接或间接调用自身的算法称为递归算法。
算法中要对边界条件处理,而对非边界条件的处理要分为3步:
- 分:问题划分的子问题;
- 治:对各个子问题递归调用去解决;
- 合:合并子问题的解为问题的解。
边界条件与递归方程是递归函数的两个要素,递归函数只有具备了这两个要素,才能在有限次的计算后得到结果。
N的阶乘
1 | int fac(int n){ |
斐波那契数列
1 | int fibonacci(int n){ |
全排列
1 |
|
1 | 1 2 3 |
hanoi 塔
1 | void hanoi(int n,int a,int b,int c){ |
二分搜索术
1 | int BinarySearch(ElementType A[],ElementType K,int N){//折半查找 |
棋盘覆盖
- 易知,在任何一个的棋盘覆盖中,用到的 L 型骨牌个数恰为
1 | //坐标:左上行号,左上列号,特殊方格所在行号,特殊方格所在列号,棋盘大小 |
合并排序
1 | //归并递归算法 |
快速排序
1 | void Swap(ElementType *x,ElementType *y){ |
线性时间选择
1 | //采用随机快排 平均时间复杂度0(n) |
2.贪心算法
活动安排
用数组f[]
表示最大结束时间,并从小到大排序 s[]
为其对应的开始时间,A[]
辅助表示是否满足条件
1 | template<class Type> |
最优装载
1 | template<class Type> |
哈夫曼编码
1 | template<class Type> |
单源最短路径
针对带权有向图,设置顶点集合S,并不断地做贪心选择来扩充这个集合。
算法描述:输入一个带权有向图G=(V,E),E={1,2···,n},顶点v是源 起点。c是一个二维数组,c[i][j]
表示边( i , j ) 的权。当(i,j)不属于E时,c[i][j]
=∞。dist[i] 表示当前从源到顶点 i 的最短路径长度。
1 | template<class Type> |
最小生成树
1 | //Prim |
3.动态规划
矩阵连乘
1 | //计算矩阵乘积 |
最长公共子序列
1 | void LCSlength(int m,int n,char *x,char *y,int **c,int **b){ |
凸多边形最优三角剖分
1 | template<class Type> |
最优二叉搜索树
1 | void OBST(int a,int b,int n,int **m,int **s,int **w){ |