1 介绍
2 数学基础(一定考)
2.1 复杂度函数的阶
2.2 常用不等式
2.2 递归方程的求解
- 迭代法
- 数学归纳法
- 主定理法
变量代换
注意特例
3 分治法
重点掌握用分治法求解问题
- 分解divide->解决conquer->合并merge
- 归并排序
- 大整数乘法
对于长度是n/2的乘法,只需要进行3次即可
- 快速矩阵相乘Strassen算法
对于矩阵乘法,本来是O(n3)的时间复杂度,定义10个部分和、7个部分积,拆成7个n/2*n/2的矩阵相乘
- 最近点对问题
利用鸽巢问题和下面的定理,merge阶段每个点最多只需要计算和6个点的距离即可
- 凸壳问题
转化成极坐标->按极角大小排序->利用栈判定是否出现在三角形内部 - 快速傅里叶变换
时域抽选,频域对大于N/2和小于N/2两种情况进行归并 - 线性时间选择算法
找划分点,将集合分成大于k、等于k、小于k三部分,问题在于如何均匀的选取划分点??
递归调用本算法来求中位数
4 动态规划
动态规划是典型的以空间换时间的时空权衡策略,要考虑状态空间的大小,当状态空间巨大时,动态规划算法的效率很低
优化子结构:原问题的优化解包含了子问题的优化解
重叠子问题:求解问题时需要重复求解子问题
- 钢条切割问题
- 流水线优化调度问题
- 0/1背包问题
- 矩阵链乘法问题
对递归方程的理解是对矩阵链切一刀,将其分成两个地方分别计算,可以切在1~n-1个地方
如何求解递归方程??
卡特兰数的定义为:C(n)= C(0)*C(n-1) + C(1)*C(n-2) + … + C(n-1)C(0),求解出
所有队员矩阵链乘法的递归方程,求解结果是第n-1个卡特兰数 - 凸多边形三角剖分
递归方程:
- 最长公共子序列问题
子序列元素不一定非要连续,只要下标严格递增就好 - 最优二叉搜索树问题
5 贪心法:
- 重点在于贪心算法的使用条件,掌握贪心算法求解优化问题
核心在于通过局部最优选择得到全局最优结果,可是为什么一定对呢? - 贪心选择性质
- 优化子结构
所以算法的正确性证明包括:贪心选择性质+优化子结构+数学归纳法 - 活动选择问题
- 霍夫曼编码
- 最小生成树:Kruskal算法和Prim算法
- 单源最短路径:dijkstra算法
- 城堡守卫问题->圆弧覆盖问题->直线覆盖问题->活动选择问题
6 概率分析(和随机算法结合到一起去考)
- 雇佣问题
利用指示器随机变量,Xi表示第i个面试者被雇佣,X表示面试过程中被雇佣的人数
- 随机排列数组1:用随机生成的数组P作为sort key进行排序
- 随机排列数组2:随机交换两个元素
- 生日悖论:屋子内人数必须达到多少人,才能使两个人生日相同的机会达到50%
方法一:
假设有k个人,求两个人生日不一样的概率:
(1-1/n)(1-2/n)…[1-(k-1)/n]<=e-1/ne-2/n…e-(k-1)/n=e-k(k-1)/2n<=1/2
k>=23
方法二:设随机变量X表示生日相同的人的对数
- 球和箱子:b个箱子,每次投球球等可能的落入其中一个箱子中,要使每个箱子中至少有一个球,需要投球多少次
(礼券收集者问题:收集多少张礼券才能集齐b种礼券)
设随机变量ni表示第i-1次命中到第i命中之间投球的次数,第i阶段投中成功的概率是(b-i+1)/b,所以E[ni]=b/(b-i+1)
- 特征序列:投一个标准硬币n次,最长连续正面的序列的期望长度
- 在线雇用问题:面试并拒绝前k个应聘者,再雇佣其后比前面k个应聘者分数更高的第一个应聘者。最佳k值约为0.37n