算法基础概念

最近在看网易公开课算法导论,本想自己整理一下,但是还懒了,下面把一篇博客转载过来吧(主要是算法的一些基础概念和求解递归式)

http://www.gocalf.com/blog/algorithm-complexity-and-master-theorem.html



假设有两个函数f(n)g(n),都是定义在正整数集上的正函数。上述四个记号的含义分别是:

o   f(n) = O(g(n))c>0,n0N,nn0,f(n)≤cg(n)f的阶不高于g的阶。

o   f(n) = Ω(g(n))c>0,n0N,nn0,f(n)≥cg(n)f的阶不低于g的阶。

o   f(n) = θ(g(n))f(n)=O(g(n))&&f(n)=Ω(g(n))f的阶等于g的阶。

o   f(n) = o(g(n))ε>0,n0N,nn0,f(n)/g(n)<εf的阶低于g的阶。

可见,记号O给出了函数f(n)在渐进意义下的上界(但不一定是最小的),相反,记号Ω给出的是下界(不一定是最大的)。如果上界与下界相同,表示f(n)g(n)在渐进意义下是同阶的(θ),亦即复杂度一样。

 

 

 

 

解递归式的方法:

 

 

算法设计中经常会用到递归,利用递归式的方法可以清晰地显示算法的整个过程,而对于分析算法的复杂度,解递归式就有了用处,这里的方法来自于《算法导论》。

(一)代换法:

实质上就是数学归纳法,先对一个小的值做假设,然后推测更大的值得正确性。由于是数学归纳法,那么我们就需要对值进行猜测。现在,我们看下面这个例子:

我们先假设一个结论T(n) = O(lg(n - b)),并且假设对T(n / 2上取整)成立(这就是数学归纳法了),那么把T(n/ 2上取整)用假设的结论进行代换,我们有T(n) <= lg((n - b)) / 2上取整)

<=lg((n - b) / 2 + 1) + 1 = lg(n - b + 2),对于任意的b >= 2,即满足要求T(n)<= lg(n) = O(lgn)。证毕。

这是一个很简单的例子,但是其中有些事情还是要交代的。

一个是结论的猜测不是一个容易的事情。另一个是在上面的例子中我没有直接下结论说T(n)= O(lg(n)),而是减去了一个常数b,这是为什么呢?答案是:we canprove something stronger for a given value by assuming something strongerfor smaller values.还有一点值得说明,请看下面这个例子:

这里出现了sqrt(n),我们采用变量代换的方法:令n= 2 ^ m,则上式变为T(2^ m) = 2T(2 ^ (m / 2) ),再设S(m)= T(2 ^ m),则得到S(m)= 2S(m / 2) + 1。我们先假设S(m)= m - b <= O(m),且对S(m/ 2)成立,那么S(m)= 2 * (m - b) / 2 + 1 = m - b + 1,对于任意的b >= 1都有S(m) =O(m),然后回代有T(n)= T( 2 ^ m) = S(m) = O(m) = O(lgn)

这里我们采用了变量代换的方法。如果假设时,感觉变量不明朗,那么这是一种很有效的方法。

(二)递归树方法:

利用递归树方法求算法复杂度我想最好的例子就是归并排序了,这里我不想拿归并排序做例子,而只是用书中一些更简单形象的例子来说明:

根据上式我们建立递归式T(n) = 3T(n / 4) + cn^2,这里我们抛去上下界函数的影响(sloppinessthat we can tolerate),并且把Theta(n^ 2)cn^2代替。下面建立递归树模型:

 

 

在递归树中,每一个结点都代表一个子代价,每层的代价是该层所有子代价的总和,总问题的代价就是所有层的代价总和。

所以,我们利用递归树求解代价,需要知道什么呢,一个是每一层的代价,一个是层数,就是这两个。

这些,都需要我们用觉察的态度来发现,而事实证明,这不是一件难事,很多情况下是有规律可循的。

我们且看上面这个例子,递归树的构造很简单,当递归调用到边界是,就达到了常量T(1),达到常量T(1)所用到的递归次数就是整个递归树的深度,我们从图中可以得到第i层的结点的代价为n / ( 4^ i ),当n/ (4 ^ i) = 1i= log4(n)时,递归到达了边界,所以,整个递归树的深度就是i= log4(n)。我们要求的总的代价是所有的总和,结果为O(n^ 2)。计算过程我就不再累述了。但是,递归树并不是都是这样的满的树,也就是不是每一层的结点都是相同的结构,所以我们在构造递归树的时候要仔细看好这一点,才能保证在计算时不会出错。

(三)主方法:

其实应该叫做主定理方法,利用这个方法,我们只需要记住主定理的三种情况,并且在满足一定的条件下,就可以速度解出递归式。主定理的三种情况不在这里给出,一定条件我只说一下我对于多项式大于(或小于)的理解,比如x1.1x,那么x就是多项式小于1.1x,二者差了一个多项式(0.1x),而至于xxlgx就不存在多项式大于(或小于)的关系。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值