【算法导论-主定理】用主方法求解递归式 学练结合版

article/2025/9/19 3:15:56

问题:若某算法的计算时间表示为递推关系式:T(N)=2T(N/2)+NlogN 且 T(1)=1

则该算法的时间复杂度为( )。
O(Nsqrt(N))
O(NlogN)
O(N(logN)^2)
O(N^2logN)
O(N^2)

解析:

应该是 O(N(logN)^2)
参考网址:主定理和《算法导论》
在这里插入图片描述
但是博主说其实你不会主定理也没事儿,只要能找几个特殊值带入,并根据符号O的意义排除选项即可。所以……其实可以投机取巧。(望天)
主定理在《算法导论》的第53页时间复杂度章节有讲到(是的,黑色的很厚的那本)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
对于三种情况的每一种,我们将函数f(n)与函数 n l o g b a n^{log_ba} nlogba进行比较。 直觉上, 两个函数较大者决定了递归式的解。若函数 n l o g b a n^{log_ba} nlogba更大,如情况1,则解为 T ( n ) = Θ ( n l o g b a ) T(n)=Θ(n^{log_ba}) T(n)=Θ(nlogba)。若函数f(n)更大,如情况3,则解为 T ( n ) = Θ ( f ( n ) ) T(n)=Θ(f(n)) T(n)=Θ(f(n))。若两个函数大小相当, 如情况2,则乘上一个对数因子,解为 T ( n ) = Θ ( n l o g b a l g n ) = Θ ( f ( n ) l g n ) 。 T(n)= Θ(n^{log_ba}lgn) = Θ(f(n)lgn)。 T(n)=Θ(nlogbalgn)=Θ(f(n)lgn)
注意, 这三种情况并未覆盖f(n)的所有可能性。情况1和情况2之间有一定间隙,f(n)可能小于 n l o g b a n^{log_ba} nlogba但不是多项式意义上的小于。 类似地,情况2和情况3之间也有一定间隙 ,f(n)可能大于 n l o g b a n^{log_ba} nlogba.但不是多项式意义上的大于。如果函数f(n)落在这两个间隙中,或者情况3中要求的正则条件不成立,就不能使用主方法来求解递归式。
在第一种情况中,不是 f(n)小于 n l o g b a n^{log_ba} nlogba就够了,
而是要多项式意义上的小于。 也就是说,f(n)必须渐近小于 n l o g b a n^{log_ba} nlogba,要相差一个因子 n ϵ n^ϵ nϵ,其中ϵ是大于0的常数。 在第三种情况中,不是f(n)大于 n l o g b a n^{log_ba} nlogba就够了,而是要多项式意义上的大于,而且还要满足“正则”条件 a f ( n / b ) ≤ c f ( n ) af(n/b)\leq cf(n) af(n/b)cf(n)。我们将会遇到的多项式界的函数中, 多数都满足此条件。
假设我们有递推关系式:
在这里插入图片描述
根据这个题, T ( N ) = 2 T ( N / 2 ) + N l o g N 且 T ( 1 ) = 1 , T(N)=2T(N/2)+NlogN 且 T(1)=1, T(N)=2T(N/2)+NlogNT(1)=1可知 a = 2 , b = 2 , f ( n ) = N l o g N , a=2,b=2,f(n)=NlogN, a=2b=2f(n)=NlogN所以将函数 f ( n ) = N l o g N f(n)=NlogN f(n)=NlogN与函数 N l o g 2 2 l o g N = N l o g N N^{log_22}logN=NlogN Nlog22logN=NlogN进行比较,他们复杂度相近,是情况2。从而根据公式:
f ( n ) = Θ ( n l o g b a l o g k n ) , 则 T ( n ) = Θ ( n l o g b a l o g k + 1 n ) 。 f(n)=Θ(n^{log_ba}log_kn) ,则T(n)=Θ(n^{log_ba}log^{k+1}n)。 f(n)=Θ(nlogbalogkn)T(n)=Θ(nlogbalogk+1n)
有:
Γ ( n ) = n l o g 2 2 ∗ ( l o g 2 n ) = n ( l o g n ) 2 \Gamma(n) = n^{log_22}*(log^2n)\,= n(logn)^2 Γ(n)=nlog22(log2n)=n(logn)2

类题试解:
1.二叉树的遍历: T ( n ) = 2 T ( n 2 ) + Θ ( 1 ) T(n)=2T(\frac{n}{2})+Θ(1) T(n)=2T(2n)+Θ(1)

可知 a = 2 , b = 2 , f ( n ) = 1 a=2,b=2,f(n)=1 a=2b=2f(n)=1, n l o g 2 2 = n n^{log_22}=n nlog22=n f ( n ) = Θ ( 1 ) f(n)=Θ(1) f(n)=Θ(1)大,是情况1,则根据公式,解为 T ( n ) = Θ ( n l o g 2 2 ) = Θ ( n ) T(n)=Θ(n^{log_22})=Θ(n) T(n)=Θ(nlog22)=Θ(n)

2.二分搜索(折半搜索) T ( n ) = T ( n 2 ) + Θ ( 1 ) T(n)=T(\frac{n}{2})+Θ(1) T(n)=T(2n)+Θ(1)

可知a=1,b=2,f(n)=Θ(1),
n l o g 2 1 = n 0 = 1 n^{log_21}=n^0=1 nlog21=n0=1,故f(n)和O(1)复杂度相近,是情况2,
根据公式, T ( n ) = l g n T(n)=lgn T(n)=lgn

3.最大子数组问题和归并排序的分治算法的运行时间: T ( n ) = 2 T ( n 2 ) + Θ ( n ) T(n)=2T(\frac{n}{2})+Θ(n) T(n)=2T(2n)+Θ(n)

可知a=2,b=2, f ( n ) = Θ ( n ) f(n)=Θ(n) f(n)=Θ(n)
n l o g 2 2 = n n^{log_22}=n nlog22=n f ( n ) = Θ ( n ) f(n)=Θ(n) f(n)=Θ(n)相近,是情况2,
根据公式, T ( n ) = Θ ( n l o g b a l g n ) = Θ ( f ( n ) l g n ) 。 T(n)= Θ(n^{log_ba}lgn) = Θ(f(n)lgn)。 T(n)=Θ(nlogbalgn)=Θ(f(n)lgn)
可得 T ( n ) = Θ ( n l o g 2 2 l g n ) = Θ ( n l o g 2 n ) 。 T(n)= Θ(n^{log_22}lgn) = Θ(nlog_2n)。 T(n)=Θ(nlog22lgn)=Θ(nlog2n)

4.递归式 T ( n ) = 3 T ( n / 4 ) + n l g n T(n) = 3T(n/4) +nlgn T(n)=3T(n/4)+nlgn

我们有 a = 3 , b = 4 , f ( n ) = n l g n a=3,b=4, f(n)=nlgn a=3,b=4,f(n)=nlgn,而 n l o g 4 3 = O ( n 0.793 ) n^{log_43}=O(n^{0.793}) nlog43=O(n0.793)
由于 f ( n ) = Ω ( n l o g 4 3 + ϵ ) = Ω ( n 0.793 + ϵ ) f(n)=\Omega(n^{log_43+ϵ})=\Omega(n^{0.793+ϵ}) f(n)=Ω(nlog43+ϵ)=Ω(n0.793+ϵ),其中 ϵ ≈ 1 − 0.793 = 0.2 ϵ\approx1-0.793=0.2 ϵ10.793=0.2 f ( n ) = n l g n > n l o g 4 3 f(n)=nlgn>n^{log_43} f(n)=nlgn>nlog43满足情况3。且对常数c=0.75和所有足够大的n有 3 ( n / 4 ) l g ( n / 4 ) ≤ 0.75 n l g n = c f ( n ) 3(n/4)lg(n/4)\leq 0.75nlgn=cf(n) 3(n/4)lg(n/4)0.75nlgn=cf(n)
故解为 T ( n ) = Θ ( n l g n ) T(n)= Θ(nlgn) T(n)=Θ(nlgn)

5.矩阵乘法问题第一个分治算法 T ( n ) = 8 T ( n 2 ) + Θ ( n 2 ) T(n)=8T(\frac{n}{2})+Θ(n^2) T(n)=8T(2n)+Θ(n2)

a = 8 , b = 2 , f ( n ) = n 2 a=8,b=2,f(n)=n^2 a=8,b=2,f(n)=n2, n l o g 2 8 = n 3 n^{log_28}=n^3 nlog28=n3可以看出 f ( n ) = n 2 < n 3 f(n)=n^2<n^3 f(n)=n2<n3,应该是情况1,其中 ϵ = 1 ϵ=1 ϵ=1
T ( n ) = Θ ( n 3 ) T(n)= Θ(n^3) T(n)=Θ(n3)

6.Strassen算法的运行时间 T ( n ) = 7 T ( n / 2 ) + Θ ( n 2 ) T(n) = 7T(n/2) +Θ(n^2) T(n)=7T(n/2)+Θ(n2)

有a=7,b=2, n l o g 2 7 ≈ n 2.805 > n 2 , 故 f ( n ) < n 2.805 n^{log_27}\approx n^{2.805}>n^2,故f(n)<n^{2.805} nlog27n2.805>n2,f(n)<n2.805,应用情况1公式:
T ( n ) = Θ ( n l o g 2 7 ) T(n)= Θ(n^{log_27}) T(n)=Θ(nlog27)
改写底为 l g 7 lg7 lg7
在这里插入图片描述
l o g 2 7 = l g 7 l g 2 = 0.84 0.3 = 2.807 log_27=\frac{lg7}{lg2}=\frac{0.84}{0.3}=2.807 log27=lg2lg7=0.30.84=2.807
算法导论中的lg以2为底
T ( n ) = Θ ( n l g 7 ) = Θ ( n 2.807 ) T(n)= Θ(n^{lg7})=Θ(n^{2.807}) T(n)=Θ(nlg7)=Θ(n2.807)

不能使用主定理的情况: T ( n ) = 2 T ( n / 2 ) + Θ ( n l g n ) T(n) = 2T(n/2) +Θ(nlgn) T(n)=2T(n/2)+Θ(nlgn)

其中 a = 2 , b = 2 , f ( n ) = n l g n a=2,b=2,f(n)=nlgn a=2b=2f(n)=nlgn
l o g 2 2 = n log_22=n log22=n f ( n ) = n l g n f(n)=nlgn f(n)=nlgn渐进大于n,而不是多项式大于n
多项式意义上的大于,顾名思义,就是两个函数的商大于一个多项式。严格表述为如下形式:当我们说f(x)多项式意义上大于g(x)时,我们是指:存在实数e>0,使得f(x)>g(x)*n^e。)
在这里插入图片描述
因此, 递归式落入了情况2和情况3之间的间隙,不可以使用主定理。
不过可以利用公式:
f ( n ) = Θ ( n l o g b a l o g k n ) , 则 T ( n ) = Θ ( n l o g b a l o g k + 1 n ) 。 f(n)=Θ(n^{log_ba}log_kn) ,则T(n)=Θ(n^{log_ba}log^{k+1}n)。 f(n)=Θ(nlogbalogkn)T(n)=Θ(nlogbalogk+1n)
根据算法导论P73的上下界取整:
在这里插入图片描述
可知 O ( N l o g 2 2 N ) O(Nlog^2_2N) O(Nlog22N)是T(n)的上界( O ( N 3 ) O(N^3) O(N3)也是上界,但是不是紧确界)


http://chatgpt.dhexx.cn/article/ANVvxO7H.shtml

相关文章

【算法设计与分析】12 主定理及其应用

主定理是一个非常有用的定理&#xff0c;前面我们学习的所有知识都可以用主定理来求解&#xff0c;而不必要使用复杂的计算方法来求解 文章目录 1. 主定理1.1 主定理的应用背景1.2 主定理内容 2. 主定理的应用2.1 求解递推方程 例12.2 求解递推方程 例22.3 求解递推方程 例3 3.…

主定理 Master Theorem

分治法主定理 主定理的证明 假设有递归式&#xff1a; T ( n ) a T ( n b ) f ( n ) T(n) aT(\frac{n}{b}) f(n) T(n)aT(bn​)f(n) 证明&#xff1a; T ( n ) a T ( n / b ) f ( n ) T(n) aT(n/b) f(n) T(n)aT(n/b)f(n) a [ a T ( n / b 2 ) f ( n / b ) ] f ( n…

基于主定理以及递推树求解递归算法的时间复杂度

非递归算法的时间复杂度可以通过找到执行次数最多的代码&#xff0c;计算其执行次数即可。但是递归算法的时间复杂度则无法通过这种方式求得。有一种最简单的求递归算法的方式&#xff0c;即利用递推方法求解时间复杂度。如下所示&#xff1a; 这种方法求时间复杂度很简单&…

时间复杂度-主定理分析

目录 1.定理 2.举例 1.定理 主定理分析是一种时间复杂度的计算方式&#xff0c;当时间复杂度推根据实际情况推算出来是下面T(n)的形式的时候&#xff0c;可以通过主定理分析计算它的时间复杂度。 其实就是根据前半部分的a,b&#xff0c;计算出一个结果&#xff0c;再和后面的…

递归式求解-主定理

1.主定理:设a>1和b>1为常数,设f(n)为一函数,T(n)由递归式 对非负整数定义,其中n/b指下取整或上取整.那么T(n)可能有如下的渐进界: (1)若对于某常数 ε>0,有,则; (2)若.则; (3)若对于某常数 ε>0,有,且某常数 c<1与所有足够大的n,有,则 2.主定理的使用方法. 由主…

使用主定理求时间复杂度

文章目录 使用主定理求时间复杂度主定理直接可用主定理转化之后可以利用主定理使用主定理求时间复杂度 很多算法最后都可以写出 T ( n ) = a T ( n b ) + f ( n ) ) ( a ≥ 1 , b ≥ 1 ) T(n)=aT(\frac{n}{b}) + f(n)) (a\ge1,b\ge1) T(n)=aT(bn​)+f(n))(a≥1,b≥1) 的递推式…

主定理学习笔记

主定理用于求递推方程的阶。 设a>1, b>1为常数&#xff0c;f(n)为函数&#xff0c;T(n)为非负整数&#xff0c;且 T(n) aT(n/b) f(n) &#xff08;注意a、b取值范围&#xff09; a代表递归调用子问题的个数(子问题数>小于原问题&#xff0c;故a>1)n / b代表子…

主定理证明

转自GoogleSite算法导论习题解答&#xff0c;先fork一下 算法导论其实已经给出了具体的证明步骤&#xff0c;但是还是有些省略&#xff0c;此文章是对主定理进行了完全的证明&#xff1b; 主定理的证明大致分为两个阶段&#xff1a; (1)假设n为b的整数次幂&#xff0c;如1,b,b^…

主定理(递归式分析)

上图来自《算法导论》 其意思为&#xff1a; 令a≥1&#xff0c;b>1都是常数&#xff0c;f(n)是一个函数 T&#xff08;n&#xff09;是定义在非负整数上的递推式&#xff1a; 1、对某个常数&#xff0c;有&#xff0c;则 2、若&#xff0c;则 3、对某个常数&#xff…

主定理学习及理解

主定理证明 请参考该文章: https://wenku.baidu.com/view/993d716a84868762cbaed522.html 主定理理解运用 看完上面的推导证明, 想必对主定理的推导有了一定理解, 那么又如何理解运用呢? 先晒下公式: 公式大致阐明了三种情况: f(n) < nlogb a, 则取时间复杂度为O(nlogb…

主定理

《目录》 使用主定理求解递归式? 算例 ?证明主定理 使用主定理求解递归式 主定理是分治算法分析中非常重要的定理。 如&#xff0c;我们要处理一个 规模为 的问题通过分治&#xff0c;得到 个规模为 的问题&#xff0c;分解子问题和合并子问题的时间是 &#xff1a; 在上…

主定理(Master Theorem)

主定理是分析分治算法时间复杂度很重要的一个定理。 我们之前对于一个递归类的代码进行时间复杂度分析&#xff0c;一般会采用递归树的方式&#xff0c;下面我们先介绍一下递归树的方式&#xff0c;理解之后&#xff0c;再引入主定理的相关内容。 分治的介绍 分治算法总是将…

主定理(Master Theorem) 及其应用

主定理"Master Theorem" 一、主定理(Master Theorem)二、应用举例 在分析算法的时候&#xff0c;我们经常需要分析递归算法的时间复杂度。 一、主定理(Master Theorem) 主定理适用于求解如下递归式算法的时间复杂度&#xff1a; 其中&#xff1a; n 是问题规模大…

2020.10.27【GWAS】丨使用vcftools绘制pi(θπ) 选择消除分析图

这两天在整理GWAS流程&#xff0c;发现绘制θπ选择消除分析图在网上只能找到计算π的代码&#xff0c;但是没有绘图代码&#xff0c;于是自己搞了一下&#xff0c;供大家参考。 vcftools --vcf AxiomGT1.calls.vcf --window-pi 1000 --window-pi-step 1000 --out GT1_pi 生成…

使用vcftools或者gcta计算群体间固定指数(Fixation index,FST)

下列所用到的数据均为千人基因组数据库 1、通过vcftools计算FST 命令行如下&#xff1a; ./vcftools --vcf input_data.vcf --weir-fst-pop population_1.txt --weir-fst-pop population_2.txt --out pop1_vs_pop2 其中&#xff0c;input_data.vcf就是输入的vcf格式 population…

那些在vcftools安装上踩的坑

[TOC]那些在vcftools上踩的坑 那些在vcftools安装上踩的坑 近期由于学习需要所以需要安装vcftools做基因比对分析。然后的然后就各种问题来了… vcftools在kail linux 系统下安装 老生常谈的话题就直接上代码吧。 // 这个想必大家都很熟悉 tar -zxvf vcftools_0.1.13.tar.…

vcftools如何在Linux系统中安装

这里&#xff0c;记录一下vcftools的安装教程。 1. 下载 https://vcftools.github.io/examples.html 下载到本地&#xff0c;上传到服务器中。 2. 解压缩 unzip vcftools-vcftools-v0.1.16-18-g581c231.zipcd vcftools-vcftools-581c231/3. 安装 bash autogen.sh ./configur…

vcftools 安装 (bash autogen.sh ./configure出问题)

安装可以直接从gitclone安装&#xff0c;省略下载安装包及解压的过程&#xff0c;代码如下 git clone https://github.com/vcftools/vcftools.git 官方的教程步骤接下来是配置环境及安装 bash autogen.sh ./configure make make install 但是我之前一直在这一步卡了很久…

vcftools-linux-conda安装、使用

shell conda命令安装&#xff1a; conda install -c bioconda vcftoolsvcftools文档&#xff1a; OUTPUT FILE OPTIONS--out <output_prefix>This option defines the output filename prefix for all files generated by vcftools. For example, if <prefix> is…

Chr函数

函数chr&#xff08;&#xff09;的作用是返回其参数所表示的字符&#xff0c;参数是这个字符的ASCII码。 CHR函数&#xff0c;传入一个数值&#xff0c;返回这个数值对应的ascii码字符&#xff0c;比如chr(65)输出的是大写的A 示例&#xff1a; Private Sub Command2_Click…