asymptotic notation and recursion

来源:互联网 发布:真实的朝鲜 知乎 编辑:程序博客网 时间:2024/05/21 19:43

终于放暑假啦。

在家窝了两天,尝试着看了看《编程之美》,发现里面的东西虽然有趣,但作为系统学习算法的资料却不太合适。所以还是从最基本的学起,计划这个暑假粗学一遍算法导论,主要是考虑到还要准备GRE,想要仔细研究恐怕没时间。

写这个系列主要是给自己做一个备忘录和心得。考虑到接下来接触到的东西可能会越来越多,很容易遗忘,这样一个东西也许能帮助我回想起来。当然,也可以作为读者的一个checklist,你们可以在看的时候check一下这块知识我有没有掌握。我个人认为所谓掌握就是能像老师一样讲给别人听,让别人也听懂。由于时间的原因,我将不会在这里记录完整的笔记,而且这也没有必要,因为东西书上都有。

值得一提的是我在学习的过程中看了MIT的6046号课程视频,在网易上有公开课。我个人认为听课是帮助人们快速学习的最好方式,尽管也许不大深入理解,但是效率很高,鉴于我时间有限,故我采用的是听课加看书结合的方式,以课为主。课程一共有19讲,昨天和今天看了1,2讲,以后会以每天一讲的速度学习下去,所以写这个东西也算是给自己一个任务,以免自己荒废了。

进入主题


渐进分析:直白的说就是忽略低次项和常数参数的来进行算法复杂度分析,比如2n^2+n+2我们只分析n^2。这种分析方式的great之处在于,我们不在乎某个有限输入的复杂度,而在乎它的增长,即当输入规模为无穷大的时候算法的复杂度。诚然 ,肯定存在当输入规模比较小的时候,100n^2比n^3复杂度大,但最终前者会远小于后者,而我们关注最终情况

渐进符号:O, o, big Omega, small Omega, big Theta,需要弄清楚谁是upper/lower/tight upper/tight lower bound,另外要明白任何输入规模的函数f(n),只对应唯一的big Theta.

递归式:给出初始条件和递归方程的式子,例如给出:

T(n) = Theta(1)  ( n = 1 )

T(n) = 4*T(n/2) + n ( n > 1)

递归式的解:有三种方法可以计算复杂度

1. 代换法:这个方法很简单,但是说起来有点逗比,就是猜一个T(n)的答案,然后验证。。。

比如上面的那个递归式,高中数学学得还行的同学肯定都能猜到解应该是a*n^2+b*n这样的形式,所以直接带入求得结果求出是n^2-n。

2. 递归树法:这个方法的特点是图示,易于理解,我这里不好表示,大家自行看书或者视频吧。

3. 主方法:这个方法好处是直接给出答案,缺点是对递归式的形式有要求,另外前两种方法能求出T(n)的确切值,但是这种方法只能求出big Theta的值。这种方法需要用代换法验证。


好啦,今天就到这儿了,明天见



0 0