当前位置: 首页 > news >正文

浙江省建设银行网站首页地推网

浙江省建设银行网站首页,地推网,郑州知名做网站公司有哪些,好公司网站建设引言? 在分析算法的时候,我们经常需要分析递归算法的时间复杂度。Master——Theorem 正是用于快速得出递归算法时间复杂度的方法。 Master—Theorem 假设某个递归算法的时间复杂度递归公式为:T(n)a∗T(nb)ndT(n)a*T(\frac{n}{b}) n^{d}T(…

引言?

在分析算法的时候,我们经常需要分析递归算法的时间复杂度。Master——Theorem 正是用于快速得出递归算法时间复杂度的方法。

Master—Theorem

假设某个递归算法的时间复杂度递归公式为:T(n)=a∗T(nb)+ndT(n)=a*T(\frac{n}{b}) + n^{d}T(n)=aT(bn)+nd,其中a>1,b>1,d>0a>1,b>1,d>0a>1,b>1,d>0
这个表达式其实是在表达:将规模为nnn的问题转换为a个规模为nb\frac{n}{b}bn的子问题,在合并这些子问题的解时需要花费O(nd)O(n^{d})O(nd)时间。

例如Merge-Sort算法里面,我们将规模为nnn的排序问题先转换为 2 个规模为n2\frac{n}{2}2n的子问题,然后合并这两个子问题需要花费O(n)O(n)O(n)的时间,因此其时间复杂度的递归公式为T(n)=2T(n2)+O(n)T(n)=2T(\frac{n}{2})+O(n)T(n)=2T(2n)+O(n)

那么 Master——Theorem是干嘛的呢?个人觉得,这就是主定理其实提供一种对形式为T(n)=a∗T(nb)+ndT(n)=a*T(\frac{n}{b}) + n^{d}T(n)=aT(bn)+nd递推公式的快速求解Trick,从接下来的证明我们看到,这个主定理只是对我们的一般化证明过程做了一个小小的总结。

先看主定理的内容:
设某个递归算法的时间复杂度递归公式为:T(n)=a∗T(nb)+ndT(n)=a*T(\frac{n}{b}) + n^{d}T(n)=aT(bn)+nd,其中a>1,b>1,d>0a>1,b>1,d>0a>1,b>1,d>0。则有:

  • a&lt;bda&lt;b^{d}a<bd,也就是logba&lt;dlog_{b}a &lt; dlogba<d 时,T(n)=O(nd)T(n)=O(n^{d})T(n)=O(nd)
  • a=bda=b^{d}a=bd,也就是logba=dlog_{b}a=dlogba=d 时,T(n)=O(nlogba∗logn)T(n)=O(n^{log_{b}a}*logn)T(n)=O(nlogbalogn)
  • a&gt;bda&gt;b^{d}a>bd,也就是logba&gt;dlog_{b}a&gt;dlogba>d 时,T(n)=O(nlogba)T(n)=O(n^{log_{b}a})T(n)=O(nlogba)

现在,我们来证明一下。
我们知道,这种子问题的划分方式是将规模为n的问题,分解为a个问题规模为nb\frac{n}{b}bn的子问题。
对于第0层(最高层),合并子问题需要花费ndn^{d}nd的时间

对于第 1层(第一次划分出出来的子问题),共有1∗a1*a1a个子问题,每个子问题合并需要花费(nb)d(\frac{n}{b})^{d}(bn)d,于是在第1层,合并一共需要花费O(a∗(nb)d)O(a*(\frac{n}{b})^{d})O(a(bn)d)时间,也就是abd∗nd\frac{a}{b^{d}}*n^{d}bdand

对于第2层。第2层需要对第1层的每个问题都划分为a个更小的子问题。因此,这一层一共有a∗aa*aaa个子问题,而这每个子问题合并需要O((nb2)d)O((\frac{n}{b^{2}})^{d})O((b2n)d)时间。于是这一层合并需要花费:a2∗(nb2)d=(abd)2∗nda^{2}*(\frac{n}{b^{2}})^{d} =(\frac{a}{b^{d}})^{2}*n^{d}a2(b2n)d=(bda)2nd

类似的,我们发现第三层合并需要a3∗(nb3)d=(abd)3∗nda^{3}*(\frac{n}{b^{3}})^{d} =(\frac{a}{b^{d}})^{3}*n^{d}a3(b3n)d=(bda)3nd
···
···
最后第k成的合并需要ak∗(nbk)d=(abd)k∗nda^{k}*(\frac{n}{b^{k}})^{d} =(\frac{a}{b^{d}})^{k}*n^{d}ak(bkn)d=(bda)knd,
那么这个最大的k是多少呢?我们知道,第k层中每个问题的规模是1,因此我们从下往上推,第k层每个问题规模为1,那么第k-1层 每个问题规模为b,第k-2层每个问题规模为b2b^{2}b2,一直最顶层问题规模为n为止。此时有:b∗b∗b∗b⋅⋅⋅b=nb*b*b*b···b=nbbbbb=n,即bk=nb^{k}=nbk=n,因此k=logbnk = log_{b}nk=logbn

因此,一共有k层。

ok,我们将各层合并消耗的时间累加起来就是T(n)了。
T(n)=nd+(abd)nd+(abd)2nd+(abd)3nd+⋅⋅⋅+(abd)kndT(n)=n^{d}+(\frac{a}{b^{d}})n^{d}+(\frac{a}{b^{d}})^{2}n^{d}+(\frac{a}{b^{d}})^{3}n^{d}+···+(\frac{a}{b^{d}})^{k}n^{d}T(n)=nd+(bda)nd+(bda)2nd+(bda)3nd++(bda)knd
我们把T(n)写更好看一些:
T(n)=(abd)0nd+(abd)1nd+(abd)2nd+(abd)3nd+⋅⋅⋅+(abd)kndT(n)=(\frac{a}{b^{d}})^{0}n^{d}+(\frac{a}{b^{d}})^{1}n^{d}+(\frac{a}{b^{d}})^{2}n^{d}+(\frac{a}{b^{d}})^{3}n^{d}+···+(\frac{a}{b^{d}})^{k}n^{d}T(n)=(bda)0nd+(bda)1nd+(bda)2nd+(bda)3nd++(bda)knd
把各项的公因子ndn^{d}nd提出出来:
T(n)=nd((abd)0+(abd)1+(abd)2+(abd)3+⋅⋅⋅+(abd)k)T(n)=n^{d}((\frac{a}{b^{d}})^{0}+(\frac{a}{b^{d}})^{1}+(\frac{a}{b^{d}})^{2}+(\frac{a}{b^{d}})^{3}+···+(\frac{a}{b^{d}})^{k})T(n)=nd((bda)0+(bda)1+(bda)2+(bda)3++(bda)k)

ok,这看起来就是一个等比数列了哇。为了方便,我们令q=abdq=\frac{a}{b^{d}}q=bda
那么:
T(n)=nd(q0+q1+q2+q3+⋅⋅⋅+qk)T(n)=n^{d}(q^{0}+q^{1}+q^{2}+q^{3}+···+q^{k})T(n)=nd(q0+q1+q2+q3++qk)
这就是一个等比数列求和问题,很明显,我们可以使用等比数列求和的方法来搞。
等式两边同时乘以q,得到:
T(n)=nd(q0+q1+q2+q3+⋅⋅⋅+qk)T(n)=n^{d}(q^{0}+q^{1}+q^{2}+q^{3}+···+q^{k})T(n)=nd(q0+q1+q2+q3++qk) ==>
qT(n)=nd(q1+q1+q2+q3+⋅⋅⋅+qk+1)qT(n)=n^{d}( q^{1}+q^{1}+q^{2}+q^{3}+···+q^{k+1})qT(n)=nd(q1+q1+q2+q3++qk+1)
上下相减,得到:
(1−q)T(n)=nd(1−qk+1)−−−−−−(式1)(1-q)T(n)=n^{d}(1-q^{k+1})------(式1)(1q)T(n)=nd(1qk+1)(1)
此时我们需要对q分情况讨论:
如果q=1q=1q=1.
那么会得到0=00=00=0这样的恒等式。此时等比数列错位相减法失效。考虑到q=1,说明这个数列每一项都一样,而第一项为q0q^{0}q0,换句话说,这个等比数列的和其实就是kkk(因为有K项)。
于是:T(n)=nd∗k=nd∗logbnT(n)=n^{d}*k=n^{d}*log_{b}{n}T(n)=ndk=ndlogbn,使用换底公式:T(n)=nd∗k=nd∗log2nlog2bT(n)=n^{d}*k=n^{d}*\frac{log_{2}{n}}{log_{2}{b}}T(n)=ndk=ndlog2blog2n
当b>=2时:T(n)=nd∗log2nlog2b&lt;nd∗log2nlog22=O(ndlog2n)T(n)=n^{d}*\frac{log_{2}{n}}{log_{2}{b}}&lt;n^{d}*\frac{log_{2}{n}}{log_{2}{2}}=O(n^d log_{2}{n})T(n)=ndlog2blog2n<ndlog22log2n=O(ndlog2n)
如果q!=1q!=1q!=1.
那么1−q!=01-q!=01q!=0,于是将式1的左右两边同除以1−q1-q1q,得到:
T(n)=nd(1−qk+1)1−qT(n)=\frac{n^{d}(1-q^{k+1})}{1-q}T(n)=1qnd(1qk+1)
q&lt;1q&lt;1q<1,即abd&lt;1\frac{a}{b^{d}} &lt; 1bda<1。当k很大时qk+1q^{k+1}qk+1趋于0,所以1−qk+11-q^{k+1}1qk+1趋于1。所以有T(n)≈nd∗11−q=c∗ndT(n)\approx n^{d} *\frac{1}{1-q}=c*n^{d}T(n)nd1q1=cnd,也就是说T(n)=O(nd)T(n)=O(n^{d})T(n)=O(nd).

q&gt;1q&gt;1q>1,即abd&gt;1\frac{a}{b^{d}} &gt; 1bda>1。当k很大时,qk+1q^{k+1}qk+1趋于无穷,1−qk+11-q^{k+1}1qk+1趋于−qk+1-q^{k+1}qk+1,所以主要项就是qkq^{k}qkT(n)≈nd∗qkT(n)\approx n^{d} *q^{k}T(n)ndqk.

k=logbn,q=abdk=log_{b}{n},q=\frac{a}{b^{d}}k=logbn,q=bda代入。因此有T(n)≈nd∗qk=nd∗(abd)logbn=nd∗alogbnbdlogbn=nd∗alogbn(blogbn)d=nd∗alogbnnd=alogbnT(n)\approx n^{d} *q^{k}=n^{d}* (\frac{a}{b^{d}})^{log_{b}n}=n^{d}*\frac{a^{log_{b}n}}{b^{dlog_{b}n}}=n^{d}*\frac{a^{log_{b}n}}{(b^{log_{b}n})^{d}}=n^{d}*\frac{a^{log_{b}n}}{n^{d}}=a^{log_{b}n}T(n)ndqk=nd(bda)logbn=ndbdlogbnalogbn=nd(blogbn)dalogbn=ndndalogbn=alogbn
于是T(n)=O(alogbn)T(n)=O(a^{log_{b}{n}})T(n)=O(alogbn),然而这个好像和定理不太一样,我们需要使用到一个对数的运算性质。

即:alogbn=nlogbaa^{log_{b}n}=n^{log_{b}a}alogbn=nlogba
证明过程很简单,就是使用对数的实际含义。

假设bx=nb^{x}=nbx=n,那么x=logbnx=log_{b}nx=logbn,x就是这个对数的含义。
同时假设by=ab^{y}=aby=a,那么y=logbay=log_{b}ay=logba.

于是,左边alogbna^{log_{b}n}alogbn可以写成:(by)x(b^{y})^{x}(by)x;
而右边可以写成(bx)y(b^{x})^{y}(bx)y.显然,(by)x(b^{y})^{x}(by)x=(bx)y(b^{x})^{y}(bx)y,于是,左边等于右边。
因此alogbn=nlogbaa^{log_{b}n}=n^{log_{b}a}alogbn=nlogba是成立的。

所以T(n)=O(alogbn)T(n)=O(a^{log_{b}{n}})T(n)=O(alogbn),可以写成:T(n)=O(nlogba)T(n)=O(n^{log_{b}{a}})T(n)=O(nlogba).
到此为止,主定理就证明完毕。

我们观察整个证明过程,其实就是对证明过程做了一个小小的归纳总结。在实际应用中,如果忘记主定理,那么直接展开代入实际数值推一遍就可以了。

主定理的使用

主定理可以用于快速得到时间复杂度为递归公式的上界解,下面举几个栗子。

1.T(n)=3T(n2)+cnT(n)=3T(\frac{n}{2})+cnT(n)=3T(2n)+cn
那么:a=3,b=2,d=1a=3,b=2,d=1a=3,b=2,d=1,log23&gt;1log_{2}{3}&gt;1log23>1,所以T(n)=O(nlog23)T(n)=O(n^{log_{2}3})T(n)=O(nlog23)
2.T(n)=2T(n2)+cn2T(n)=2T(\frac{n}{2})+cn^{2}T(n)=2T(2n)+cn2
那么:a=2,b=2,d=2a=2,b=2,d=2a=2,b=2,d=2,log22&lt;2log_{2}2&lt;2log22<2,所以:T(n)=O(n2)T(n)=O(n^{2})T(n)=O(n2)

上面两个,不使用主定理,直接展开也可以得到一样的结果。

http://www.lbrq.cn/news/2466937.html

相关文章:

  • 旅游网站前端建设毕业论文搜索引擎优化网站排名
  • 中企动力是什么公司荆州网站seo
  • 网站播放大视频如何做今日国际重大新闻事件
  • 十大导航软件网络舆情优化公司
  • 自己建设网站用哪个全网搜索软件下载
  • 免费自助建站网站seo诊断技巧
  • 自己建设网站步骤百度app下载安装 官方
  • 邢台移动网站建设费用自己怎么优化网站
  • 电子商务公司设计网站建设惠州seo网站管理
  • 如何建议一个网站竞价排名点击器
  • seo是东莞企业网站排seo河南网站建设报价
  • wordpress做小说网站吗搜索引擎主要包括三个部分
  • 网站建设怎样上传程序长春刚刚最新消息今天
  • 哈尔滨站建站时间朔州seo
  • 手机移动网站模板百度app安装免费下载
  • 网站建设渠道网站seo优化网站
  • 舟山网站建设推荐网站制作企业
  • 桂林北站改造优化师培训
  • 网站建设公司 优势百度网页链接
  • 网站建设 职位如皋网站制作
  • 南昌旅游网站建设方案手机怎么建自己的网站
  • h5做网站什么软件头条新闻最新消息
  • 汽车网站策划西安网站seo技术
  • 同性做视频网站网站功能开发
  • 江苏网站建设价格全渠道营销
  • 河南省建设工程一体化平台哈尔滨网络seo公司
  • 哪个网站做批发的新站整站快速排名
  • 公司做网站有意义么整合营销活动策划方案
  • 专业上海网站建设福州seo技巧培训
  • 天津市住房建设委员会网站seo长尾关键词优化
  • 黑马点评01 - 项目介绍 短信登录
  • 秋招Day19 - 分布式 - 理论
  • 多场景通用车辆计数算法助力暑期交通管理
  • 洛谷刷题7.24
  • Apache Commons:Java开发者的瑞士军刀
  • 一文说清楚Hive中常用的聚合函数[collect_list]