重要技术
分治法、随机化、递归求解、动态规划、贪心算法
动态规划:
最优化问题,当作选择时,出现同样形式的子问题。每一个特定子问题有多于一种选择的集合。关键技术是存储这些子问题每一个解,防止其重复出现
贪心算法:
算是动态规划的子集,当子问题只有一种选择,就是取当前情况下的最优解时适用
平摊分析:
一种用来分析执行一系列类似操作的算法的工具。在一个操作序列中,不可能每一个都以其已知的最坏情况运行,某些操作的代价高些,而其它的低一些,考虑整体而不是一次的算法执行
其他算法:
数论算法:主要在加密系统中,如公钥加密
概率算法
遗传算法
模拟退火
蚁群优化
DNA算法
人工神经网络
第十五章 动态规划
1. 与分治法的区别:是否有公共子问题
设计步骤
描述最优解的字结构
常用剪切法进行证明: 最优解包括子问题的最优解
递归定义最优解的值
有多少子问题 递归式
子问题有多少选择 下标的变化
按自底向上计算最优解
由计算出的结果反向构造最优解
4. 动态规划就是满足
子问题独立: 如有向图中,u和v最长简单路径就不独立
最优子结构:
重叠子问题:问题以前出现过
两个条件后,通过递归从下至上地进行展开避免重复计算子问题。
6. 为了描述子问题空间: 尽量保持这个空间简单,在需要的时候扩充
7. 时间复杂度为 子问题的个数× 子问题有多少种选择
11. 做备忘录的递归方法:这种方法是动态规划的一个变形,它本质上与动态规划是一样的,但是比动态规划更好理解!
a) 使用普通的递归结构,自上而下的解决问题。
b) 当在递归算法的执行中每一次遇到一个子问题时,就计算它的解并填入一个表中。以后每次遇到该子问题时,只要查看并返回表中先前填入的值即可。
12. 备忘录方法与动态递归方法的比较:如果所有的子问题都至少要被计算一次,则一个自底向上的动态规划算法通常比一个自顶向下的做备忘录算法好出一个常数因子。因为动态规划没有使用递归的代价,只用到了循环,所以常数因子肯定比递归要好一些。
可解决的问题
两条流水线的选择
矩阵链乘法 做最少乘法运算
最长公共子序列: 两个字符串中最长的相同字符串序列,不是连续的
最优二叉查找树: 二叉查找树每个节点带概率,如何组织使得所有的搜索访问的节点数目最小
近似串匹配 (语音、手写识别,模糊查找) , K-近似匹配(样本p在T中至多k个差别):关键是建立代价函数模型,得出代价函数递推关系。
动态规划算法实例:
矩阵炼乘法的算法实现
第十六章 贪心算法
1. 在每一个贪心算法的下面,几乎总是会有一个更加复杂的动态规划解。贪心比动态规划简单,但贪心选择性有时证明比较困难。
2. 正确使用贪心算法的2个关键要素:
a) 贪心选择性质:即当考虑做何选择时,我们只考虑对当前问题最佳的选择而不考虑子问题的结果。
证明思路:在证明中先假设一个全局最优解,然后对该解采用贪心策略进行修改,得的解也是最优
算法的每一次最优解都是当时最佳的选择
b) 最优子结构:一个问题的最优解包含了其子问题的最优解。
基本步骤
a) 将优化问题转化成这样的一个问题,即先做出选择(对应于动态规划的先解决子问题再选择),再解决剩下的一个子问题。
b) 证明原问题总是有一个最优解是做贪心选择得到的,从而说明贪心选择的安全。
c) 说明在做出贪心选择后,剩余的子问题具有这样的一个性质。即如果将子问题的最优解和我们所做的贪心选择联合起来,就可以得出原问题的一个最优解。
可解决问题
赫夫曼编码
将n个字符放入概率最小优先队列中,每次从优先队列中取出两个作为0,1 分支,将其和存入优先队列中。循环操作直到Q为空
背包问题:
每一件可分割
活动安排
(n个活动各有自己的开始和结束时间,选出最大个数的活动序列)
单源点最短路径
(信息传递和交通导游):Dijkstra和Prim 都是贪心算法
多机调度:
n台机器和m个作业,每个作业花费ti时间,求将m个作业分配到n台机器,使得 每一台机器执行的max 时间最短
先将m个作业按时间递减排序,分别分配n个到n台机器
使用优先队列保存 n台机器的完成时间
while(作业分完)
弹出最近完成时间的下标,分配下一个作业
回溯和分支界限技术
解决 n!或2^n,但n并不大或增加限定条件,如八皇后, 0-1背包,旅行商问题
1. 确定解空间(常为树形),生成解空间树
2. 以深度优先(回溯)、广度优先(分支)搜索解空间树
3. 利用 判定函数 剪枝,思路:赋予算法智能,优先搜索可能的子树
优缺点
1. 首先扩展上层节点,有利于大范围剪枝
2. 需要较多的存储空间
八皇后问题
Xi!=Xj土(i-j) 判定是否斜线
子集合问题
n个正整数组成的集合和正整数C,求<1>是否存在子集元素和为C; <2> 和<=C的最大子集
解法:1. 构造解空间 Xi 取值0,1 ,则解空间为2^n 2. 构造解空间树 3. 判断条件:分支和不超过C 4. 剪枝
0-1 背包问题
物品的不可分割性
解法:1. 先按pi/wi排序 2. 判定函数:当前重量<M,继续搜索更接近M的解(用 bestP记录最大值,对每一个解使用贪心求得从i 出发的上界,若bound(i)<bestP则剪枝)
无向图的团集(每一节点互相连接)问题
求无向图中的最大的极大联通子图。应用如:n种动物将尽可能的动物放在一起喂养;多支路口的不同路线的最小分组数
旅行商问题
带权有向图中,从节点s出发遍历各节点且权值和最小的路径。
解法: 1. 求{2...n}的一个全排列。 解空间为(n-1)! 2. 树类似于八皇后 3. 判定算法
第十七章 平摊分析
1. 平摊分析与平均情况分析不同的地方是:平摊分析不考虑概率,在最坏情况下,每个操作的平均性能
2. 三种类型: 聚集分析、记账分析,势能分析
3. 聚集法: N个操作构成的序列执行时间是 O(n), 则每个操作的平均时间是 O(n)/n
以前的时间复杂度分析都是以单次操作为对象的分析它的最坏时间复杂度,而聚集分析所分析的是N次操作的总时间的最坏情况。应注意其与平均情况分析的不同之处!聚集分析:由序列的总最坏时间单次的平摊时间