递归式求解的三种方法

递归式求解的三种方法

本节阐述递归式求解的三种方法:递归树、代入法和主定理法。

O、写在前面

在分治法中,时间复杂度T(n)往往具有递归性质,被递归式所表示,譬如T(n)=T(n/4)+T(3n/4)+n,其含义其实是在表示,一个规模为n的问题,被分解为两个规模分别为n/4和3n/4的子问题(其和刚好为n)。容易知道的是T(n)中必然包含子问题的复杂度T(n/4)和T(3n/4),除此之外,还需要加上问题合并和分解的代价,我们设为f(n),在本例f(n)=n。

本节涉及的三个算法之间,也有着密切的联系。

递归树法,顾名思义,根据递归式的问题分解可以建立递归树。本方法是通过图像化分析,直接得出问题时间复杂度T(n),直观,但是缺乏严谨性。因此,该方法往往是用来猜测T(n)解析式,以让代入法证明之。

代入法,事先猜测时间复杂度的表达式,然后利用渐进上界等定义证明。猜的过程一方面靠经验,另一方面可通过递归树法分析,也有可能极其难猜(譬如T(n)=nlog^2(n)。不过其关键还是在于证明,证明方法错了,还是大写的一个G......

主定理法,特殊解法,与递归式的形式直接相关。一般而言是解形如T(n)=aT(n/b)+f(n)的递归式,通过不同的条件可直接给出时间复杂度的渐进界。

一、递归树法

本方法仅通过一个例子介绍

[图片上传失败...(image-a7a5d2-1663928156825)]

从原递归式容易知道,每一层分解、合并各个子问题的代价总和均为n。根据分治的思想,如果没有到叶子结点,那么每一层是不会存在“解决问题”的时间复杂度的。上例比较特殊,分解子问题并非等分,因此会导致递归树各分支到达叶子结点的深度是不同的,且越靠左到达叶子结点越早。

对于最左分支,问题规模以1/4的速度下降,是最早到达叶子结点——问题规模为O(1)——的分支。假设在某一层,最左分支刚好到达叶子结点,可以浅浅分类讨论一下:

  • 对于该层以前的层,没有解决问题的代价,只有分解合并的代价,为n

  • 对于该层而言,最左分支到达叶子结点,没有分解合并的代价,但是需要加上解决问题的代价。因为到达了叶子结点,所以解决问题的代价为O(1),而由于分解合并代价为O(n)(n=1),可以认为该层总复杂度仍为n

  • 对于该层之后的层而言,缺少一个分支,因此不管怎样,其总复杂度都小于n

总共来说,子问题分解彻底时,每一层问题的分解和合并时间复杂度为O(n)(渐进上界),这个结论包含最低层。而结合深度可知,总时间复杂度为O(nlog_{4/3}n)根据换底公式可换算为标准形式

T(n)=O(nlog(n))

到此,递归树可以说做到了仁至义尽,但是不得不承认,本题的答案是\Theta(nlog(n)),即nlog(n)是一个渐进紧确界,而非仅仅渐进上界,由此可见递归树法的缺漏,进一步证明将放在代入法。

本例较为特殊,子问题的分解并不是等分的。通过该问题可以更为透彻的理解整个分析过程,但仍需要说一下等分的情况:

T(n)=aT(n/b)+f(n)

则每一层分解合并代价为f(n),分解为a个规模为原来的1/b的子问题,解决问题全部放到了叶子结点层(不会出现上例那种叶子结点所在层数可能不在最底层),由于叶子结点解决问题复杂度为O(1),因此只需要计算叶子节点数即可。

每一层分出a个分支,一共分解了log_bn次(共log_bn+1层),因此解决问题总代价为:

a^{log_bn}=a^{\frac{log_an}{log_ab}}=n^{\frac{1}{log_ab}}=n^{log_ba}

而每一层分解合并的代价,为该层节点数(非叶节点)a{k}乘以f(n/bk),其中k为第几层。

因此总共代价为T(n)=n{log_ba}+\sum_{k=0}{log_bn-1}akf(n/bk),从而最终T(n)的渐进界是由其表达式中两部分增长趋势决定的,主定理法正是基于这样的思想。

二、代入法

递归树法中谈到,例子:

[图片上传失败...(image-7339c1-1663928156824)]

的准确答案是T(n)=\Theta(nlogn),为渐进紧确界,本节将证明这一点

形式化定义

复习一下,渐进紧确界T(n)=\Theta(nlogn)的定义为:

\exist c_1,c_2,n_0 > 0,s.t.\forall n>n_0,c_1\cdot nlogn\le T(n)\le c_2\cdot nlogn

渐进上界和下界只需取渐进紧确界定义不等式的一半即可。

这里采用数学归纳法证明:

n=3时,T(3)=1,若c_1\cdot 3log3\le 1\le c2\cdot 3log3,只需0\le c_1\le \frac{1}{3log3},c_2\ge \frac{1}{3log3}\\

证明右侧不等号:

假设命题在小于n时都成立,则等于n时有:

T(n)=T(n/4)+T(3n/4)+n\le c_2\cdot n/4\cdot log(n/4)+c_2\cdot 3n/4\cdot log(3n/4)+n\\ =c_2nlogn-(c_2(log4-\frac{3}{4}log3) -1)n\ge 0

因此只需c_2(log4-\frac{3}{4}log3) -1\ge 0,解得c_2\ge \frac{1}{log4-\frac{3}{4}log3}\ge 0

结合归纳基础的结果,c_2\ge max{\frac{1}{log4-\frac{3}{4}log3},\frac{1}{3log3}}

证明左侧不等号与证明右侧过程一致,结果为0\le c_1\le min{\frac{1}{log4-\frac{3}{4}log3},\frac{1}{3log3}},此处不再赘述。

综上:T(n)=\Theta(nlogn)

三、主定理法

在递归树法中已经初步介绍主定理法的思想由来,是针对与形如

T(n)=aT(n/b)+f(n)

其递归树解析过程如下:

[图片上传失败...(image-e43019-1663928156824)]

这里再来计算一次总时间复杂度

首先对于合并解分解问题的时间复杂度,需要统计每一层的该类复杂度的加和:

T_{分解合并}=\sum_{k=0}^{log_bn-1}a^kf(n/b^k)

注意这里是从0取到log_bn-1,这是因为最后一层的问题规模为n/b{log_bn},但是并不存在f(n/b{log_bn})的分解合并代价,所以不会取到log_bn。

而对于解决问题的时间复杂度,只需要看叶子结点个数即可:

T_{解决问题}=a^{log_bn}=n^{log_ba}

因此总的时间复杂度为

T(n)=n^{log_ba}+\sum_{k=0}^{log_bn-1}a^kf(n/b^k)

因此,从理论上分析,只需要判断T_{分解合并}和T_{解决问题}的趋势大小,就能判断谁是T(n)的主要决定因素。这里不加证明的给出该思路的分析结果

[图片上传失败...(image-11743f-1663928156824)]

该结论的分类,可以图示如下:

[图片上传失败...(image-702615-1663928156824)]

对于该普通形式的主定理,有以下两点需要注意:

  1. 分类图示中的大小关系并非简单的大小关系,而是级数大小关系。假设f(n)=nlog(n),显然有的是nlogn>n,但却不存在 \epsilon 使得f(n)=\Omega(n{log_ba+\epsilon})。究其原因,是logn与n\epsilon不属同一级数。从这一点可以理解到,在分类图示中,存在一个gap(见下图)

    [图片上传失败...(image-4d8920-1663928156824)]

  2. 主定理的第一种情况,除了要满足f(n)=\Omega(n^{log_ba+\epsilon}),还要满足“正则条件”:

    \exist c<1,n_0,s.t. af(\frac{n}{b})\le cf(n)

主定理的简化形式

对形如T(n)=aT(n/b)+n^k的递归式,主定理可化简如下:

[图片上传失败...(image-88841b-1663928156824)]

不要忘了注意事项

主定理的扩展形式

普通形式的注意事项中谈到,对于f(n)=nlogn是无法处理的,因为落入了三种情况间的gap中,从而不属于任何一个情况,那么此时,就可以通过扩展形式来解决

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,258评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,335评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,225评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,126评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,140评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,098评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,018评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,857评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,298评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,518评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,400评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,993评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,638评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,661评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容