主定理(Master Theorem)

article/2025/9/19 3:57:42

主定理是分析分治算法时间复杂度很重要的一个定理。

我们之前对于一个递归类的代码进行时间复杂度分析,一般会采用递归树的方式,下面我们先介绍一下递归树的方式,理解之后,再引入主定理的相关内容。

分治的介绍

分治算法总是将问题的规模不断的拆分,以归并排序为例。

假设 T ( n ) T(n) T(n)代表原问题的规模, n n n为输入数据的规模。

第一次拆分后,假设拆分成两份,规模就变成了 n 2 \frac{n}{2} 2n​,然后各自再递归调用归并排序,这部分时间复杂度为 2 T ( n 2 ) 2T(\frac{n}{2}) 2T(2n),最后将这两个排好序的子数组进行合并,所需时间为 Θ ( n ) \Theta(n) Θ(n)

Θ \Theta Θ为同阶, Ω \Omega Ω为下界, O O O为上界。

那么就可以得出:
T ( n ) = { Θ ( 1 ) n = 1 2 T ( n 2 ) + Θ ( n ) n > 1 T(n)= \left \{ \begin{aligned} & \Theta(1) \quad n=1 \\ & 2T(\frac{n}{2})+\Theta(n) \quad n>1 \end{aligned} \right. T(n)=Θ(1)n=12T(2n)+Θ(n)n>1

递归树

T ( n ) = 3 T ( n 4 ) + Θ ( n 2 ) T(n)=3T(\frac{n}{4})+\Theta(n^2) T(n)=3T(4n)+Θ(n2)​为例:

在这里插入图片描述
在这里插入图片描述
总代价为:

T ( n ) = c n 2 + 3 16 c n 2 + ( 3 16 ) 2 c n 2 + . . . + ( 3 16 ) l o g 4 n − 1 c n 2 + Θ ( n l o g 4 3 ) = ∑ i = 0 l o g 4 n − 1 ( 3 16 ) i c n 2 + Θ ( n l o g 4 3 ) < ∑ i = 0 ∞ ( 3 16 ) i c n 2 + Θ ( n l o g 4 3 ) 放缩 = 1 1 − 3 16 c n 2 + Θ ( n l o g 4 3 ) = 16 13 c n 2 + Θ ( n l o g 4 3 ) Θ ( n l o g 4 3 ) 低阶项 = O ( n 2 ) 上界 \begin{aligned} T(n) &=cn^2+\frac{3}{16}cn_2+(\frac{3}{16})^2cn^2+...+(\frac{3}{16})^{log_4^{n-1}}cn^2+\Theta(n^{log_4^3})\\ &=\sum_{i=0}^{log_4^{n-1}}(\frac{3}{16})^icn^2+\Theta(n^{log_4^3})\\ &<\sum_{i=0}^{\infty}(\frac{3}{16})^icn^2+\Theta(n^{log_4^3}) \quad \text{放缩}\\ &=\frac{1}{1-\frac{3}{16}}cn^2+\Theta(n^{log_4^3}) \\ &=\frac{16}{13}cn^2+\Theta(n^{log_4^3}) \quad \quad \Theta(n^{log_4^3})\text{低阶项}\\ &=O(n^2) \quad \text{上界} \end{aligned} T(n)=cn2+163cn2+(163)2cn2+...+(163)log4n1cn2+Θ(nlog43)=i=0log4n1(163)icn2+Θ(nlog43)<i=0(163)icn2+Θ(nlog43)放缩=11631cn2+Θ(nlog43)=1316cn2+Θ(nlog43)Θ(nlog43)低阶项=O(n2)上界
同时我们知道,每一项都包含 n 2 n^2 n2,并且系数都是正的,那么下界为 T ( n ) = Ω ( n 2 ) T(n)=\Omega(n^2) T(n)=Ω(n2)

主定理

T ( n ) = a T ( n b ) + f ( n ) T(n)=aT(\frac{n}{b})+f(n) T(n)=aT(bn)+f(n)

a: 被分解为a个子问题。

b: >1的整数,表示每次分治,问题规模都被缩小为之前的 1 b \frac{1}{b} b1​。

f ( n ) f(n) f(n): 渐进正函数,表示分解和合并的代价。

在这里插入图片描述

总代价为: T ( n ) = Θ ( n l o g b a ) + ∑ j = 0 l o g b n − 1 a j f ( n b j ) T(n)=\Theta(n^{log_b^a})+\sum_{j=0}^{log_b^{n-1}}a^jf(\frac{n}{b^j}) T(n)=Θ(nlogba)+j=0logbn1ajf(bjn)

g ( n ) = ∑ j = 0 l o g b n − 1 a j f ( n b j ) g(n)=\sum_{j=0}^{log_b^{n-1}}a^jf(\frac{n}{b^j}) g(n)=j=0logbn1ajf(bjn) Θ ( n l o g b a ) \Theta(n^{log_b^a}) Θ(nlogba)和之间 f ( n ) f(n) f(n)的大小关系决定了 g ( n ) g(n) g(n)的化简形式。

  • Θ ( n l o g b a ) > f ( n ) \Theta(n^{log_b^a})>f(n) Θ(nlogba)>f(n)
    g ( n ) = O ( n l o g b a ) g(n)=O(n^{log_b^a}) g(n)=O(nlogba)
    那么,
    T ( n ) = Θ ( n l o g b a ) + O ( n l o g b a ) = Θ ( n l o g b a ) ( 同阶 ) \begin{aligned} T(n) &=\Theta(n^{log_b^a})+O(n^{log_b^a})\\ &=\Theta(n^{log_b^a})\quad (\text{同阶}) \end{aligned} T(n)=Θ(nlogba)+O(nlogba)=Θ(nlogba)(同阶)

  • Θ ( n l o g b a ) = f ( n ) \Theta(n^{log_b^a})=f(n) Θ(nlogba)=f(n)​​,
    g ( n ) = Θ ( n l o g b a l o g n ) g(n)=\Theta(n^{log_b^a}logn) g(n)=Θ(nlogbalogn)
    那么,
    T ( n ) = Θ ( n l o g b a ) + Θ ( n l o g b a l o g n ) = Θ ( n l o g b a l o g n ) ( 同阶 ) \begin{aligned} T(n) &=\Theta(n^{log_b^a})+\Theta(n^{log_b^a}logn)\\ &=\Theta(n^{log_b^a}logn)\quad (\text{同阶}) \end{aligned} T(n)=Θ(nlogba)+Θ(nlogbalogn)=Θ(nlogbalogn)(同阶)

  • Θ ( n l o g b a ) < f ( n ) \Theta(n^{log_b^a})<f(n) Θ(nlogba)<f(n)​​​,
    g ( n ) = Θ ( f ( n ) ) g(n)=\Theta(f(n)) g(n)=Θ(f(n))
    那么,
    T ( n ) = Θ ( n l o g b a ) + Θ ( f ( n ) ) = Θ ( f ( n ) ) \begin{aligned} T(n) &=\Theta(n^{log_b^a})+\Theta(f(n))\\ &=\Theta(f(n)) \end{aligned} T(n)=Θ(nlogba)+Θ(f(n))=Θ(f(n))

综上所述:
T ( n ) = { Θ ( n l o g b a ) Θ ( n l o g b a ) > f ( n ) Θ ( n l o g b a l o g n ) Θ ( n l o g b a ) = f ( n ) Θ ( f ( n ) ) Θ ( n l o g b a ) < f ( n ) T(n)= \left \{ \begin{aligned} &\Theta(n^{log_b^a}) & \Theta(n^{log_b^a})>f(n)\\ &\Theta(n^{log_b^a}logn) & \Theta(n^{log_b^a})=f(n)\\ &\Theta(f(n)) & \Theta(n^{log_b^a})<f(n) \end{aligned} \right. T(n)=Θ(nlogba)Θ(nlogbalogn)Θ(f(n))Θ(nlogba)>f(n)Θ(nlogba)=f(n)Θ(nlogba)<f(n)
举个例子:

  1. T ( n ) = T ( 2 n 3 ) + 1 T(n)=T(\frac{2n}{3})+1 T(n)=T(32n)+1​​

    n l o g b a = n l o g 3 2 1 = 1 n^{log_b^a}=n^{log_\frac{3}{2}^1}=1 nlogba=nlog231=1​​​ 与 f ( n ) = 1 f(n)=1 f(n)=1​​​ 相等,因此 T ( n ) = Θ ( n l o g b a l o g n ) = Θ ( n l o g n ) T(n)=\Theta(n^{log_b^a}logn)=\Theta(nlogn) T(n)=Θ(nlogbalogn)=Θ(nlogn)​。​​

  2. T ( n ) = 3 T ( n 4 ) + n 2 T(n)=3T(\frac{n}{4})+n^2 T(n)=3T(4n)+n2

    n l o g b a = n l o g 4 3 n^{log_b^a}=n^{log_4^3} nlogba=nlog43 < f ( n ) = n 2 <f(n)=n^2 <f(n)=n2,因此 T ( n ) = Θ ( n 2 ) T(n)=\Theta(n^2) T(n)=Θ(n2),和上面递归树推出来的一样。​​


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

相关文章

主定理(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…

Python笔记:内置函数chr()用法

chr(i) chr()&#xff1a;输入一个整数【0&#xff0c;255】返回其对应的ascii符号&#xff0c;相反ord&#xff08;&#xff09;函数就是用来返回单个字符的ascii值&#xff08;0-255&#xff09;或者unicode数值&#xff08;&#xff09;参数 i :可以是10进制也可以是16进制的…

python中的chr和ord函数_python chr/ord函数区别和使用

原博文 2020-03-16 10:04 − python中 内置函数 chr 和 内置函数 ord 可以配对使用&#xff1b;chr函数将ascll码转为字符&#xff1b;ord函数将字符转为ascll码; 一.chr函数将ascll码转为字符 chr(65) >>&gt... 相关推荐 2019-12-23 08:11 − day3复习 >…

python中chr函数是什么意思_python函数之chr(i)

chr(i) 中文说明&#xff1a; 返回整数i对应的ASCII字符。与ord()作用相反。 参数x&#xff1a;取值范围[0, 255]之间的正数。 版本&#xff1a;该函数在python2和python3各个版本中都可用。不存在兼容性问题。 英文说明&#xff1a; Return a string of one character w…

python 中chr_python中chr

广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! python chr函数最后更新于:2020-03-10 09:26:00在python中 ord函数可以字符作为参数,返回对应的ascll码; 其中内置函数chr 与 ord函数作用相反,chr函数可以…

php chr 反斜杠,PHP chr()函数讲解

PHP chr()函数讲解 PHP chr() 函数 实例 从不同 ASCII 值返回字符&#xff1a; echo chr(52) . ""; // Decimal value echo chr(052) . ""; // Octal value echo chr(0x52) . ""; // Hex value ?> 定义和用法 chr() 函数从指定 ASCII 值返回…

chr php,php chr函数怎么用?

php chr函数用于从指定的ASCII值返回字符。语法是chr(ascii)&#xff0c;参数ascii必需&#xff0c;指ASCII值。ASCII值可被指定为十进制值、八进制值或十六进制值。 php chr函数怎么用&#xff1f; 定义和用法 chr() 函数从指定的 ASCII 值返回字符。 ASCII 值可被指定为十进制…

mysql chr函数_mysql标量函数

几种常用的标量函数&#xff0c;最简单的就是通过类select abs(-123);来使用标量函数。 abs&#xff1a;该函数返回一个数表达式的绝对。如abs(-123); adddate&#xff1a;该函数将一个时间间隔(参数2)添加到时戳或时戳表达式(参数1)中&#xff0c;与此函数同功能的还有date_ad…

Oracle CHR函数

这篇主要说一下这个函数CHR&#xff0c;字符函数&#xff0c;我在项目里常用到的是用这个函数进行换行&#xff0c;刚好有时间就去官网好好了解了一下这个函数的用法和含义&#xff0c;现在分享一下&#xff0c;大家共同学习。 1.CHR返回的字符在数据库字符集中具有与n相等的二…

Python二级考试基础知识(ord,chr函数详解)

目录 前言 一、两个函数的定义 二、函数的具体介绍 1.chr和ord函数的简单展示 2.chr和ord函数的简单应用 总结 前言 chr和ord两个函数&#xff0c;属于Python内置函数&#xff0c;且是一对对应的函数&#xff0c;了解此内置函数很重要的原因是因为这是属于计算机二级Python考试…

python 内置函数ord()和chr()函数用法详解

python 中的ord()函数和chr()函数 需要对字符进行转换时使用 其中ord函数可以将字符转化为你所需要的ASCII码&#xff0c;chr函数可以将0-255中的任一整数转化为你所需要的字符。 通过这样的转化 你可以方便的完成字符与数字之间的转换操作&#xff0c;更好使用for循环以及if判…

图文详解 DBMS 数据库管理系统三层架构体系(三级模式)《ClickHouse 实战:企业级大数据分析引擎》...

引文 计算机科学领域的所有问题,都可以通过添加一层中间层来解决。通过在用户和计算机中间添加一层逻辑层(概念模型层),于是就有了“数据库的三级模式”:数据库在三个级别 (层次)上进行抽象,使用户能够逻辑地、抽象地处理数据,而不必关心数据在计算机中的物理表示和存储…

DBMS 数据库管理系统的三级模式架构《ClickHouse 实战:企业级大数据分析引擎》...

引文 计算机科学领域的所有问题,都可以通过添加一层中间层来解决。通过在用户和计算机中间添加一层逻辑层(概念模型层),于是就有了“数据库的三级模式”:数据库在三个级别 (层次)上进行抽象,使用户能够逻辑地、抽象地处理数据,而不必关心数据在计算机中的物理表示和存储。…