两遍复习,第一遍 先过算啊发 第二遍,从题目入手算法
考试点:数组
第一章,时间复杂度排序 时间复杂度计算步骤 排序(快速排序 归并排序)框架
每一个不一样算法的基本思想与算法框架(基本步骤)函数
递归树方法求解递归方程编码
分治法、动态规划法以及贪心算法的设计思想并简要分析三种方法的异同spa
包含主题: 贪心算法 , 分治法,动态规划,回溯法,分支限界,线性规划设计
关键词:最优子结构blog
Q:贪心与动态规划中间的联系和区别 p93 后面总结 (背部问题,0-1背包问题)排序
基本思想:将一个大的问题分红若干小的子问题问题,分而治之递归
通常步骤:1.分解将原问题分为若干规模小,相互独立与原问题形式相同的问题 2.求解,求解各个子问题,当问题被划分的足够小的时候,就能很容易求解 3.合并,将子问题逐层合并,获得最后的解
二分搜索:
合并排序(将想要排序的序列分为两个大小相同的子集,而后分别排序,再合并 O(nlogn)):划分策略是相似二分搜索,经过递归来一层层划分直至只有一个,再一层层合并
快速排序:(将序列按照a[i]来划分两个子集,第一个子集里面都比a[i]小,第二个子集都比a[i]大) :
大整数乘法(若要精确的求出大整数在乘法运算中全部位数上的值,须要用软件的方法来求,):
有重复和无重复排列问题
基本思想:贪心算法老是作出当前最好的选择,他指望经过局部最优解来获得全局最优解
能利用贪心算法来求解的算法通常有两个特性:贪心选择性质(原问题的总体最优解能够经过一系列的局部最优的选择获得), 最优子结构(一个问题的最优解,包含其子问题的最优解)(因其具备最优子结构,能够用动态规划来求解,可是贪心会更加简单)
选择排序 每次从剩下的序列里选出最大的一个,造成最后的最优解
冒泡排序
最优装载(如何将最多的货物装上船) 采用重量最轻者优先的贪心策略来进行
活动安排(在会议时间不冲突的状况下,用有限的时间来进行最多的会议) 1.贪心策略的选择,a.最先开始与时间不冲突策略,b.最短持续时间与不冲突策略 c.最先结束时间与不冲突策略 咱们选择C贪心策略,
求哈夫曼编码:(前缀码,任一字符的代码都不能是其余字符的前缀求得最优的编码方案) 贪心策略:在全部节点中选取权值最小的两个节点做为新树的左右节点,组成一个新的节点,权值为二者之和
单源最短路径(dijkstra算法,求得最短路径(插值法)) :贪心策略,从初始状态开始,一个一个的加入与之相连的值,而后求出当前全部节点的最短路径,当将全部的点都加入时,就是最后的结果
最小生成树:
prim算法(加边): 贪心策略:在当前的子树中,选取与之相连的最小权值且不造成环的边
kruskal算法(选边): 贪心策略:在全部的边中,选取最小的且不造成环的边
多机调度问题:
分治法:将原问题划分为n个规模较小而结构与原问题类似的子问题,递归地解决这些子问题,而后再合并其结果,就可获得原问题的解(即递归解决)
动态规划:核心思想是将子问题的计算结果保存起来,若是再次遇到同一问题,就不用再次计算了。通常来讲动态规划是自下而上计算答案的集合。
思路:将子问题列成表格,写入表格中已知的初始值,写出状态转移方程(填表);
贪心算法:贪心算法是对算法中的每个决策点作一个看起来是最佳的选择,而后继续以用一样的决策方式计算由此产生的子问题。
动态规划和贪心算法共同点:求解的问题都具备最优子结构性质。
分治法与动态规划的相同点:
分治法与动态规划,两者要求原问题具备子结构,都是将问题分而治之分解成若干个规模较小的子问题;
不一样点:
动态规划是将原问题分解为多个子问题,经过计算出子问题的结果构造一个最优解。动态规划经过迭代法自底向上求解,动态规划将分解后的子问题理解为相互间有联系,有重叠的部分;
分治法是将原问题分解为多个子问题,利用递归对各个子问题独立求解,最后利用各子问题的解进行合并造成原问题的解。分治法将分解后的子问题当作是相互独立的。
贪心算法:依赖于当前已经作出的全部选择,采用自顶向下(每一步根据策略获得当前一个最优解,保证每一步都是选择当前最优的解决方法。
基本要素: 最优子结构 原问题最优解包含子问题最优解 重叠子问题性质 求解子问题过程当中,不少子问题是重复的,那么只需求解一次,而后把结果存在表中,之后直接使用 这个条件不是必要条件,只是子问题重叠更能体现动态规划的优点
与分治算法的关系与区别: 分出的子问题每每不相互独立, 用一个表来记录已经解决的子问题
技巧:
求解步骤: 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背包问题
最大团问题
单源最短路经
装载问题