算法复习
包含主题: 贪心算法 , 分治法,动态规划,回溯法,分支限界,线性规划
关键词:最优子结构
Q:贪心与动态规划中间的联系和区别 p93 后面总结 (背部问题,0-1背包问题)
递归分治算法
基本思想:将一个大的问题分成若干小的子问题问题,分而治之
一般步骤:1.分解将原问题分为若干规模小,相互独立与原问题形式相同的问题 2.求解,求解各个子问题,当问题被划分的足够小的时候,就能很容易求解 3.合并,将子问题逐层合并,得到最后的解
经典问题
二分搜索:
合并排序(将想要排序的序列分为两个大小相同的子集,然后分别排序,再合并 O(nlogn)):划分策略是类似二分搜索,通过递归来一层层划分直至只有一个,再一层层合并
快速排序:(将序列按照a[i]来划分两个子集,第一个子集里面都比a[i]小,第二个子集都比a[i]大) :
大整数乘法(若要精确的求出大整数在乘法运算中所有位数上的值,需要用软件的方法来求,):
有重复和无重复排列问题
贪心算法
基本思想:贪心算法总是做出当前最好的选择,他期望通过局部最优解来得到全局最优解
能利用贪心算法来求解的算法一般有两个特性:贪心选择性质(原问题的整体最优解可以通过一系列的局部最优的选择得到), 最优子结构(一个问题的最优解,包含其子问题的最优解)(因其具有最优子结构,可以用动态规划来求解,但是贪心会更加简单)
经典贪心选择问题
选择排序 每次从剩下的序列里选出最大的一个,形成最后的最优解
冒泡排序
最优装载(如何将最多的货物装上船) 采用重量最轻者优先的贪心策略来进行
活动安排(在会议时间不冲突的情况下,用有限的时间来进行最多的会议) 1.贪心策略的选择,a.最早开始与时间不冲突策略,b.最短持续时间与不冲突策略 c.最早结束时间与不冲突策略 我们选择C贪心策略,
求哈夫曼编码:(前缀码,任一字符的代码都不能是其他字符的前缀求得最优的编码方案) 贪心策略:在所有节点中选取权值最小的两个节点作为新树的左右节点,组成一个新的节点,权值为两者之和
单源最短路径(dijkstra算法,求得最短路径(插值法)) :贪心策略,从初始状态开始,一个一个的加入与之相连的值,然后求出当前所有节点的最短路径,当将所有的点都加入时,就是最后的结果
最小生成树:
prim算法(加边): 贪心策略:在当前的子树中,选取与之相连的最小权值且不形成环的边
kruskal算法(选边): 贪心策略:在所有的边中,选取最小的且不形成环的边
多机调度问题:
练习题