文章目录
写在前面
首先,怕误人子弟必须声明一下本人很菜(越复习越觉得完蛋了 作为一个科班研究生算法学成这样非常惭愧(跪 ,可能写的都不是很懂,很多内容打算背过去了。因为我发现好像真的有人看所以多提醒一句。。(大家就只食用目录吧
其次,本文只也许够应付考试,个人使用。而且其实就是ppt内容只是我自己喜欢这样整理。虽然全力理解内容且认真书写但也可能存在错误,如有发现麻烦指正,谢谢🌹
最后,因为不知道考试怎么考,本人的复习方式是照着目录讲一遍自己的理解+写伪代码(如果来的及会再做一个综合纯享版),再做一下上课讲过的例题和作业(印象里只有主定理、FFT、网络流上课练习+分治和动规两次作业)。
文章持续更新中,或许考前能发完也可能发不完。
祝我们好运🌹
硬币找零
1.贪心
- 当前硬币体系:{1,5,10,25,100},需要找零x
- 直接贪心:给面额排序;开集合保存已经找零的集合;每次找不大于x的最大的面额c,如果没有则无解,有就x-c,把c加入集合然后继续
- 伪代码:
2.证明最优
贪心在特定的面额体系下是最优的,现表示第k个硬币的面额为Ck,数目为Nk
证明步骤如下:
-
特定的面额体系下一定满足一系列性质,比如当前面额下:
Ck = 1 :Nk<=4
Ck = 5 :Nk<=1
Ck1 = 10 & Ck2=5 :N(k1+k2)<=2(25=10+10+5)
Ck = 25 :Nk<=3 -
考虑当x在Ck到Ck+1之间,如果用贪心法一定拿k
-
现要根据性质证明拿k一定最优:
如果不拿k,那就只能拿C1 … Ck-1
但是这不满足列出的性质 -
故只剩下了贪心的选项,而当x - Ck是同理的。
-
可以试试{1,10,25}的硬币体系。
区间调度(选子集)
问题就是一组有开始结束时间的任务,选出一组不冲突的包含任务最多的子集。
1.排序后贪心
- 需要考虑以什么为标准排序:最早开始时间?最早结束时间?最短?可以画一下:
- 思路:以最早结束时间为基准排序,之后直接贪心。每次选择结束时间最早+开始时间晚于集合最后一个元素的结束时间的放入集合,直到遍历完。
- 伪代码:
2.证明最优
以下是我粗浅的理解。
- 思路:反证法。主要是如何定义
- 假设贪心法取出来的任务是i1 i2 … ir … ik
- 而有一个额外的最优算法取出来的任务是j1 j2 … jr … jm
- 设这个r是i和j取出来最后一个一样的(我的理解是也可以没有一样的),那么对于下一个r+1(这个是一定存在的因为假设m>k),i取的一定比j取的结束时间早。而对于同是只取一个任务显然i的取法更好所以j不是最优即不存在另外的最优算法。
区间划分(调度所有)
问题可以说成一堆课怎么排教室让教室数最少。
1.排序后贪心
- 仍然要考虑按照什么排序:还是最早开始时间最晚结束时间最短时间三个选项:这次选最早开始的。
- 思路:每一个新开的教室都要单独存储一个集合,用教室数保存下标。每一个任务需要依次判断已经有的教室是否能塞下,能塞则更新这个教室,不能塞要新开。
- 伪代码:
2.一些结论
- 时间复杂度:O(nlogn)
- 一个结论:定义depth深度是 在任意时间点包含的最大任务数的数量,而最小教室数 = depth
我放弃看证明了。
最小延迟调度Scheduling to Minimize Lateness
?
Dijkstra单源最短路径
1.问题定义
- 一对儿点s-t的最短路径(单源到单点):找一条路minimize cost
- 单源最短:一个源点到所有点的最短:dijkstra
2.思路
- 记录两个数据:源点到所有点的最短距离 & 已经找到了最短路径的顶点集合
先歇会儿
3. 伪代码
最小生成树
1.一些定义
都是我的理解 非常不严谨
- 路:图里的一些节点,边联通
- 环:路的基础上封闭
- cut 割:把图中的节点分为两个部分
- cutset 割集:边的两个顶点分别在两个部分的边的集合
- 如果C是一个环,D是一个割集,那么C和D会重合偶数条边(可证)
- 生成树:图中的所有点,边连通且无环
- 生成树满足的一些性质:
存在V-1条边,v是顶点数量
减一条边变成割,加一条边存在环
红蓝定理