原先一直没注意这一门,大概是因为学这些算法的时候,板子都不知道背多少遍了。可是考试毕竟不一样,如果来个证明很容易抓瞎。
看了往年的试题,可能确实因为难度高,范围一缩再缩,虽然是基本按照算导来的,但是算法基本都是最基础的那种。20年之前网络流也是重点,最小割最大流,现在完全不提了。21年之前一般要出一道模板3SAT规约题,而本学期只是简单一提,完全没讲到具体规约的过程。
总而言之,范围还是挺有限的,不过考虑到课件全英文+大量证明,想要真掌握还是挺难。
大概有这么几个重点:
1.时间复杂度,上下界。应该会有分析题,但是我一般是靠脑补。注意理论。
五种符号分别是渐进上界O(一般的时间复杂度),上界o,渐进下界Ω,下界ω,以及一个渐进紧确界那个奇怪的符号。
可能涉及到证明,后续各种算法大概率都会出个复杂度的问吧,不过对于一般的算法看循环去猜差不多总能对。
2.递推式的复杂度解析,通常用主定理就行,偶尔可以猜猜,但是不好证明。
三种方式:猜想+数学归纳证明,递归树(也就是模拟每一层分治,分别计算,注意合并的成本),主定理(是从递归树推出来的,证明看过但是实在想不起来了。)
主定理最常用,但是有时候不好合并也需要用递归树。
别忘了三种情况。如果前面大就取前面,一样大就加个log,后面大还需要比较af(n/b)<=cf(n)且c<1,也就是不能越分治花的时间越长,那就没法往下推了。如果满足,则用后面当上界。
logb a是怎么推出来的?考虑递归树逐层往下,一共会有logb(n)层,每层需要分裂a个子问题,那么在满足上述3的条件的情况下,可以忽略非叶子节点造成的损耗(都是log级别的),一共有a^(logb(n))个叶子,每个是O(1),总共就