算法复习-研一上
算法复习
两遍复习,第一遍 先过算啊发 第二遍,从题目入手
考试点:
第一章,时间复杂度排序 时间复杂度计算步骤 排序(快速排序 归并排序)
每个不同算法的基本思想与算法框架(基本步骤)
递归树方法求解递归方程
分治法、动态规划法以及贪心算法的设计思想并简要分析三种方法的异同
包含主题: 贪心算法 , 分治法,动态规划,回溯法,分支限界,线性规划
关键词:最优子结构
Q:贪心与动态规划中间的联系和区别 p93 后面总结 (背部问题,0-1背包问题)
递归分治算法
基本思想:将一个大的问题分成若干小的子问题问题,分而治之
一般步骤:1.分解将原问题分为若干规模小,相互独立与原问题形式相同的问题 2.求解,求解各个子问题,当问题被划分的足够小的时候,就能很容易求解 3.合并,将子问题逐层合并,得到最后的解
经典问题
二分搜索:
合并排序(将想要排序的序列分为两个大小相同的子集,然后分别排序,再合并 O(nlogn)):划分策略是类似二分搜索,通过递归来一层层划分直至只有一个,再一层层合并
快速排序:(将序列按照a[i]来划分两个子集,第一个子集里面都比a[i]小,第二个子集都比a[i]大) :
大整数乘法(若要精确的求出大整数在乘法运算中所有位数上的值,需要用软件的方法来求,):
有重复和无重复排列问题
贪心算法
基本思想:贪心算法总是做出当前最好的选择,他期望通过局部最优解来得到全局最优解
能利用贪心算法来求解的算法一般有两个特性:贪心选择性质(原问题的整体最优解可以通过一系列的局部最优的选择得到), 最优子结构(一个问题的最优解,包含其子问题的最优解)(因其具有最优子结构,可以用动态规划来求解,但是贪心会更加简单)
经典贪心选择问题
选择排序 每次从剩下的序列里选出最大的一个,形成最后的最优解
冒泡排序
最优装载(如何将最多的货物装上船) 采用重量最轻者优先的贪心策略来进行
活动安排(在会议时间不冲突的情况下,用有限的时间来进行最多的会议) 1.贪心策略的选择,a.最早开始与时间不冲突策略,b.最短持续时间与不冲突策略 c.最早结束时间与不冲突策略 我们选择C贪心策略,
求哈夫曼编码:(前缀码,任一字符的代码都不能是其他字符的前缀求得最优的编码方案) 贪心策略:在所有节点中选取权值最小的两个节点作为新树的左右节点,组成一个新的节点,权值为两者之和
单源最短路径(dijkstra算法,求得最短路径(插值法)) :贪心策略,从初始状态开始,一个一个的加入与之相连的值,然后求出当前所有节点的最短路径,当将所有的点都加入时,就是最后的结果
最小生成树:
prim算法(加边): 贪心策略:在当前的子树中,选取与之相连的最小权值且不形成环的边
kruskal算法(选边): 贪心策略:在所有的边中,选取最小的且不形成环的边
多机调度问题:
分治法、动态规划法、贪心算法基本思想,以及区别和联系
分治法:将原问题划分为n个规模较小而结构与原问题相似的子问题,递归地解决这些子问题,然后再合并其结果,就可得到原问题的解(即递归解决)
动态规划:核心思想是将子问题的计算结果保存起来,如果再次遇到同一问题,就不用再次计算了。一般来说动态规划是自下而上计算答案的集合。
思路:将子问题列成表格,写入表格中已知的初始值,写出状态转移方程(填表);
贪心算法:贪心算法是对算法中的每一个决策点做一个看起来是最佳的选择,然后继续以用同样的决策方式计算由此产生的子问题。
动态规划和贪心算法共同点:求解的问题都具有最优子结构性质。
分治法与动态规划的相同点:
分治法与动态规划,二者要求原问题具有子结构,都是将问题分而治之分解成若干个规模较小的子问题;
不同点:
动态规划是将原问题分解为多个子问题,通过计算出子问题的结果构造一个最优解。动态规划通过迭代法自底向上求解,动态规划将分解后的子问题理解为相互间有联系,有重叠的部分;
分治法是将原问题分解为多个子问题,利用递归对各个子问题独立求解,最后利用各子问题的解进行合并形成原问题的解。分治法将分解后的子问题看成是相互独立的。
贪心算法:依赖于当前已经做出的所有选择,采用自顶向下(每一步根据策略得到当前一个最优解,保证每一步都是选择当前最优的解决方法。
练习题
动态规划 DP 多阶段决策过程最优的通用方法
基本要素: 最优子结构 原问题最优解包含子问题最优解 重叠子问题性质 求解子问题过程中,很多子问题是重复的,那么只需求解一次,然后把结果存在表中,以后直接使用 这个条件不是必要条件,只是子问题重叠更能体现动态规划的优势
与分治算法的关系与区别: 分出的子问题往往不相互独立, 用一个表来记录已经解决的子问题
技巧:
求解步骤: 1.找出最优解性质(交叠的子问题) 交叠子问题的初始条件(边界条件) 2.递归定义最优值 3.自底向上计算最优值 4. 根据最优值得到的信息来得到最优解
动态规划在形式上往往表现为填矩阵的形式
动态规划的难点在于前期的设计:
a)怎么描述问题,使它能表述为一个动态规划问题(具备什么特征?最有子结构,多阶段决策,思考)
b)递推式的写出(逆向思维去分析或正向思维去递归),确定你要求的是哪个值
c)有了递推式可以画个矩阵的图(一般只从式子上不太容易看出来,当然,对于牛人来说可以藐视),
在图中关注以下两点:
初始条件
填矩阵的顺序(即怎么去写代码控制语句)
动态规划与贪心
完全不存在具有后效性状态定义的问题应该都是贪心问题
动态规划与分治
分治:1.分成独立的子问题 2.自顶向下求解
DP: 1.分为重叠的子问题 2 自底向上求解
动态规划与备忘录方法
备忘录方法是用表格来保持递归中重复的子问题的方法,与动态规划的区别主要是:
备忘录:递归方式是自顶向下, 动态规划是自底向上
相关问题
斐波那契数列
矩阵连乘 1.A[1,n] 最优次序包含 A[1,k] 和A[k+1,n]的最优解 2.将其建立递归关系 3.计算最优值 递归问题中很多子问题被重复计算,使其递归式自底向上计算,用数组存储 4.构造最优解 根据A[1][n]中的内容,来回构次序
最长公共子序列 c[i][j] 1.最优公共子结构 2.如何来定义递归 c[i][j] 记录Xi Yi 的最长公共子序列长度
0-1背包问题
最大字段和 普通,分治,动态规划三种解法
回溯法
是一个既带有系统性又带有跳跃性的搜索算法,他在问题的解空间树里,按照深度优先策略,从根节点去搜索. 适用于解组合数较大的问题
解法步骤:
1.确定问题的解空间
2.确定易于搜索的解空间结构
3.以深度优先来搜索解空间,并在搜索过程中用剪枝函数避免无效搜索
子集树 :解的长度不是固定的,并且解和元素顺序无关
排列树 : 由n个元素的排列形成
相关问题
0-1 背包问题
最大团
着色问题
分支限界法
广度优先算法搜索问题的解空间树
从活节点表选取下一拓展借点的不同方式导致不同的分支限界法
队列式分支限界法 (按照先进先出)
优先队列式分支限界法 (按照优先级)
回溯法与分支限界法的区别:
(1)求解目标方面
回溯法的求解目标是找出解空间中满足约束条件的所有解,而分支限界法的求解目标则是找出满足约束条件的一个解,或是在满足约束条件的解中找出使一目标函数值达到极大或极小的解,即在某种意义下的最优解。
(2)搜索方式方面
回溯法采用深度优先搜索方式,而分支限界法采用广度优先搜索或是最小耗费优先搜索解空间树。
2.回溯法与分支限界法的联系:
二者都是在问题的解空间树T上搜索问题解的算法。
相关问题
0-1背包问题
最大团问题
单源最短路经
装载问题