标准的分治策略:
注:标准的分治策略的定义里面就包含的递归;
解决问题的步骤:
将问题分解为若干小问题,且每个小问题与大问题同型;
递归解决这些小问题;
将子问题的解答合并,获得大问题的解答;
计算效率的方法:
递归表达式 —将抽象的表达式用图形的方式展开,便于理解—>递归树
替换解法:先猜一个答案,归纳法验证,解决表达式中的常数;
大师解法:将抽象的递归表达式进行展开,分解合并;将其分为两部分:比较两者的大小(大于,等于,小于,无法比较);
典型问题: 求乘方运算,矩阵乘法,斐波那契序列,VLSI布线;
动态规划思想:
主要目的:优化,即:以最优方式解决问题;
与分治策略的不同点:
虽也将大问题分解为小问题,且小问题中有许多是重复的,这样有表格存储结果,省的重复计算,从而提高效率;动态规划是对分治思想的一种改善,在
发现分解出来的子问题有重叠时,使用自底向上的策略避免重复计算;
注:动态规划的英文叫Dynamic Programming,其中programing指的是表格查询法;
分治策略解决问题的步骤:
分析出最优解决方案的结构
递归定义这个方案
由底至上构建方案;
典型问题: 流水线问题,最长公共子序列,最优二叉搜索树
动态规划和线性规划、非线性规划(静态规划)的关系:
动态规划的核心是找出一个问题包含的子问题及其表现形式;
动态规划比静态规划更容易获得最优解;
动态规划可以得到一组最优解(原问题及子问题的最优解),而非线性规划只能得到全过程的一个最优解;
注:在特定的条件下,动态规划和静态规划是可以相互转换的;
贪婪选择思想: 只考虑眼前,每一步都最优,通过局部最优达到全局最优;
最小生成树:
Kruskal算法:选边
Prime算法:选点
霍夫曼树和编码:
霍夫曼编码:按照符号出现的频率编码;频率越高,其编码越短;频率越低,其编码越长;
霍夫曼树:为了方便生成霍夫曼编码,构建一棵带权重的总长为最小的树,即:将频率高的结点置于离树根较近的位置上;
将“树”转换为“码”:将树中所有左边分支赋为0,右边分支赋为1,符号的编码为根到达它所经过的路径标号;
标准分治、动态规划、贪婪选择比较:
标准分治 |
动态规划 |
贪婪选择 |
|
问题类型 |
通用问题 |
优化问题 |
优化问题 |
子问题结构 |
每个子问题不同 |
很多子问题重复 |
只有一个子问题 |
子问题数 |
全部都要解决 |
全部都要解决 |
只需解决一个 |
选择与求解次序 |
先选择后解决子问题 |
先解决子问题后选择 |
先选择后解决子问题 |
随机化思想:
目的:
1.为了防止最差结果出现;
2.解答我们不能确定性解答的问题;
拉斯维加斯算法:为第一种目的而设计的算法;
蒙特卡罗算法:为第二种目的而设计的算法;
拉斯维加斯保障计算结果的正确性,但不保障算法的时间效率;
蒙特卡罗算法保障了时间效率,但不保障计算结果的正确性;
经典问题:素性测试,矩阵乘积验证器,随机化最小生成树,随机数的生成;