算法导论 学习笔记 第四章 递归

来源:互联网 发布:geo数据挖掘套路 编辑:程序博客网 时间:2024/06/06 08:43

Θ(n(logba))
Θ(lga)

这一章主要是介绍了三种求运行时间的方法。这三种方法都是解决递归问题的。就像分治法这种问题的算法的运行时间。
这三种方法分别是替换法/递归树方法/主方法

4.1替换法(The substitution method)

这个方法有两个步骤:1.猜一个答案    而比较悲催的是现在没有一个通用的方法去猜正确的答案(都说是猜了..)。    但是除了一些经验公式可以让你更容易猜出答案意外还有一些技术细节上的    忽略可以让你更好的猜对答案    1.可以忽略边界    2.可以忽略上取整和下取整    3.假设输入规模n是整数2.用数学归纳法去证明你猜的答案是正确的    上例子:T(n) = 2T(n/2) + n    怎么猜呢?这个好像就是是归并排序的表达式啊。归并排序法的运行时间是O(nlgn)    那就猜这个呗。然后带入:    T(n) <= 2((c(n/2)lg(n/2)) + n         <= cnlg(n/2) + n          = cnlg(n/2) - cnlg2 + n          = cnlgn - cn + n         <=cnlgn(只要c>=1)然后就基本搞定了吧。然后这个例子正好在边界条件上竟然不满足。然后书上给了两个解决这种问题的方法:    1.忽略边界条件(我没理解错吧?)    2.可一个改变边界条件

陷阱

书上讲了一个例子。这个例子的意思就是你一定要得到你猜的那个答案:比如你猜的是O(nlgn),那就必学得到这样的表达式:    T(n) <= cnlgn.才算是对的。

换元法(changing variables)

这个方法用在那些看起来递归的部分非常复杂,比如有根号的情况下使用。

4.3递归树方法(The recursion-tree method)

递归树方法呢,也分两个步骤:1.将方程式展开成树一样的形式,然后得出答案    怎么展开呢?具体步骤不讲了。反正就是展开以后每个节点表示运行一个步骤时用的代价(cost)。    求法是先将每一层的各个节点相加得到每一层用的代价。    然后将各个层用的代价加起来久得到答案了    计算当中要得到树的层数和最底层的数字。    有个小问题我就没明白下面这两个表达式是怎么想等的?但是算一算还真是:

n(logba)a(logbn) 厉害了!
如果有人恰好看到这个。帮个忙分析一下呗。
2.用替换法证明答案是对的

主方法(The master method)

一看这个名字就知道这是不明觉厉了。网易公开课里面的讲师还解释了一下为什么叫master method。。为什么?没为什么!就是这事用的最多的,最主要的方法。所以就叫主方法...先抄上书上的定义:    let a >= 1 and b > 1 be constants,let f(n) be a function,and let T(n) be defined on the nonnegative integers by the recurrence        T(n) = aT(n/b) + f(n)    where we interpret n/b to mean either floors(n/2) or ceilings(n/2).Then T(n) can be bounded asymptotically as follows.

1.If f(n) = O(nlogbaε) for some constant ε>0 ,then T(n) = Θ(nlogba).
2.If f(n) = Θ(nlogba),Then T(n) = Θ(nlogbalgn).
3.If f(n) = Ω(nlogba+ε),for some constant ε>0,
and if af(n/b) <= cf(n) for some constant c < 1 and all sufficeintly large n,Then T(n) = Θ(f(n)).

这事甚么意思呢?

直观上(忽略某些细节而言),是通过比较n(logba) 与 f(n)的大小进行判断:如果前者大,则是Θ(n(logba));如果是后者大,答案则是Θ(f(n));如果一样大,则要乘上一个对数函数子项得到Θ(n(logba)lgn) = Θ(f(n)lgn)

作者:Bintou老师
链接:http://www.jianshu.com/p/b3e03375fb7c
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

就是两者的比较。为什么比较这两个东西咧?

是因为这两个的n(logba)表达的是递归树最底层的代价。f(n)表示的是剩下的那些层用的代价。这样就清楚了:当然是那个大就是哪个了。
阅读全文
0 0