主定理

article/2025/9/19 3:55:29

                                                                                      《目录》

  • 使用主定理求解递归式
  • ? 算例 ?
  • 证明主定理

使用主定理求解递归式

主定理是分治算法分析中非常重要的定理。

如,我们要处理一个 规模为 n 的问题通过分治,得到 a 个规模为 \frac{n}{b} 的问题,分解子问题和合并子问题的时间是 f(n)

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

在上面这个式子里,我们得要求 a \geqslant 1, b> 1 (如果 b=1 时,递推无意义),f(n) 是渐进意义上的正数。

 

回顾一下,a 和 b 的含义:

  •   a 个子问题,即 a 是原问题分为子问题的个数;
  •   每个子问题的规模是 \frac{n}{b}
  •   分治算法共三部分,分治合,而 f(n) 就是分+合的时间。

    \left \lfloor \frac{n}{b} \right \rfloor  和  \left \lceil \frac{n}{b} \right \rceil  ,向下取整和向上取整的细节,并不会影响主定理的推导,具体的数学证明,略。

如果对分治算法不熟悉,建议先看《递推式分析》。

 

而后呢,根据上面的式子我们会得到三种情况:

  • 若有实数大于零(\varepsilon >0),f(n)=O(n^{log_{b}a-\varepsilon }),则 T(n)=\Theta (n^{log_{b}a})
  • 若 f(n)=\Theta (n^{log_{b}a}),则 T(n)=\Theta (n^{log_{b}a}~logn)
  • 若有实数大于零(\varepsilon >0),f(n)=\Omega (n^{log_{b}a+\varepsilon }),且有一个实数小于一(c<1),使得较大的 n,满足 af(\frac{n}{b})\leqslant cf(n),这时候则 T(n) = \Theta (f(n))

这三种情况看起来很复杂,搞清楚他们之间的关系,快速记忆就简单了。

对于三种情况的每一种,我们将函数 f(n) 与 n^{log_{b}a} 比较,俩个函数较大者将决定递归式的解。

  • 若函数  n^{log_{b}a}  更大,如情况1,则解是 T(n)=\Theta (n^{log_{b}a});注意 f(n) 小于 n^{log_{b}a} 是渐进意义上的,要差一个因子量级 n^{\varepsilon }(\varepsilon >0)
  • 若函数 f(n) 更大,如情况3,则解是 T(n) = \Theta (f(n));注意 f(n) 大于 n^{log_{b}a} 是渐进意义上的,要差一个因子量级 n^{\varepsilon }(\varepsilon >0),还要满足 af(\frac{n}{b})\leqslant cf(n)
  • 若俩个函数相等,如情况2,则乘上一个对数因子,解为 T(n)=\Theta (n^{log_{b}a}~logn)
  • 上面的三种情况并未覆盖 f(n) 的所有可能性,情况1、情况2 之间存在间隙,f(n) 可能小于 n^{log_{b}a} 但不是多项式意义上的小于;情况2、情况3 之间也存在间隙,f(n) 可能大于 n^{log_{b}a} 但不是多项式意义上的大于;若函数 f(n) 在这俩个间隙中,或者是 情况3 中要求的 af(\frac{n}{b})\leqslant cf(n) 条件不成立,就不能使用主方法来解决递归式。

 

首先,得明白一个基准函数:\Theta (n^{log_{b}a})

有了基础函数之后,就可以根据 TA 来判定情形之间的关系。

那我们该如何记忆这个基准函数呢 ??

原来的函数是:aT(\frac{n}{b})+f(n)b 为底数,如果化为对数形式也是以 b 为底(log_{b}~a);

原函数是一个多项式,a 和 b 都是常数,算出来肯定也是一个具体的数值。

所以,我们要记这样一个基准多项式(基准函数):\Theta (n^{?}),次方(即 ? )是取对数的。

接下来,是以上三种情况的判定:

  • f(n) 是弱于基准的(渐进意义上),O(n^{log_{b}a-\varepsilon })<\Theta (n^{log_{b}a})
  • f(n) 是等于基准的(渐进意义上),\Theta (n^{log_{b}a})=\Theta (n^{log_{b}a})
  • f(n) 是强于基准的(渐进意义上),\Omega (n^{log_{b}a+\varepsilon })>\Theta (n^{log_{b}a})

 


? 算例 ?

        算例1:T(n)=4T(\frac{n}{4})+\Theta (1)  (乐高铺积木)

        分析,a = b =4,基准函数是 \Theta (n^{log_{4}4}),因为 log_{4}4=1,所以基准函数是 \Theta (n)

        那 f(n) 又是什么呢 ???

        f(n) = \Theta (1)f(n) 比基准函数 \Theta (n) 要弱,我们取一个实数(\varepsilon=1) ,即 \Theta (1)=O(n^{1-\frac{1}{2}}) = O(\sqrt{n})

        得到 T(n)=\Theta (n ).

 

        算例2:T(n)=T(\frac{n}{2})+\Theta (1)    (二分查找)

        分析,a = 1, b=2,基准函数是 \Theta (n^{log_{2}1}),因为 log_{2}1=0,所以基准函数是 \Theta (1)

        那 f(n) 又是什么呢 ???

        f(n) = \Theta (1),基准函数也是 \Theta (1) ,f(n) = 基准函数,再乘上一个 logn,即 T(n)=\Theta (logn)

 

         算例3:T(n)=2T(\frac{n}{2})+\Theta (n)  (归并排序)

         分析,a =b=2,基准函数是 \Theta (n^{log_{2}2}),因为 log_{2}2=1,所以基准函数是 \Theta (n)

         那 f(n) 又是什么呢 ???          

         f(n)=\Theta (n),基准函数也是 \Theta (n)f(n) = 基准函数,最后 T(n)=\Theta (n~logn)

 

         算例4:T(n)=7T(\frac{n}{2})+\Theta (n^{2})  (Strassen 算法)

         分析,a =7,b=2,基准函数是 \Theta (n^{log_{2}7}),大概是 n^{2.8}

         那 f(n) 又是什么呢 ???          

         f(n)=\Theta (n^{2}),基准函数是 \Theta (n^{log_{2}7}) = \Theta (n^{2.8}) 在这基础上减去 0.1 即俩者相等 f(n)=\Theta (n^{2.8-0.1}),最后 T(n)=\Theta (n^{log_{2}7})

 

         算例5:T(n)=3T(\frac{n}{4})+n~logn  (摘自《算法导论》)

         分析,a = 3, b =4,基准函数是 \Theta (n^{log_{4}3}),大概是 n^{0.8}

         那 f(n) 又是什么呢 ???   

          f(n)=n~lognn~logn 比 n^{0.8} 要强,\varepsilon =0.1 (取 0.1 依然比 n^{0.8} 大), f(n)=\Omega (n^{0.8+0.1})

          强的话,再看看是否满足 af(\frac{n}{b})\leqslant cf(n) 。

          把 a,b 代入:3(\frac{n}{4})log\frac{n}{4}\leqslant \frac{3}{4}nlogn

          得到 c, c = \frac{3}{4},c<1,满足条件,因此 T(n)=\Theta (f(n))=\Theta (n~logn)。  

        

 


证明主定理

          已经知道了基准(函数)怎么使用,可我们还不知道为什么会得到若干个渐进记号,我们会使用递归树来证明。

          假设 n=b^{L},每一次除以 b,除 k 次会为 1。

          举个例子, T(n)\left\{\begin{matrix} \Theta (1) &n=1 \\ aT(\frac{n}{b})+f(n) & n=b^{i},(i\geqslant 1) \end{matrix}\right.

          我们想知道的是,T(n)=\Theta (n^{log_{b}a})+\sum_{j=0}^{L-1}a^{j}f(\frac{n}{b^{j}}), L = log_{b}n

          从上面的式子看出 :

  •        \Theta (n^{log_{b}a}) 即基准函数;
  •        \sum_{j=0}^{L-1}a^{j}f(\frac{n}{b^{j}}) 注重的是 基准函数 和 f(n) 的强弱关系;
  •        L = log_{b}n 是递归树的高度。

            在递归树上证明时,我们写的简单些,直接把结点 f(m) 调用开销画上去。

          

 

  •             第一层的代价是:f(n)
  •             第二层的代价是:af(\frac{n}{b})
  •             第三层的代价是:a^{2}f(\frac{n}{b^{2}})
  •              \vdots             \vdots             \vdots            \vdots
  •             负一层的代价是:\Theta (n^{log_{b}a})

            整个递归树高度是 L,总的代价是:\Theta (n^{log_{b}a})+\sum_{j=0}^{L-1}a^{j}f(\frac{n}{b^{j}})

 

            f(n) 这些项会造成什么影响 ?

            对于 f(n) 的影响,我们要分析三种情况:

            总个的表达式:g(n)=\sum_{j=0}^{L-1}a^{j}f(\frac{n}{b^{i}})

  •             第一种情况:f(n)=O(n^{log_{b}a-\varepsilon })g(n)< f(n),我们求的就是这个项 :\sum_{j=0}^{L-1}a^{j}(\frac{n}{b^{j}})^{log_{b}a-\varepsilon }

            思考一下,我们能不能这个式子化为等比数列 ?

            无关的项:n^{log_{b}a-\varepsilon } 提出来,里面是  \sum_{j=0}^{L-1}a^{j}(\frac{n}{b^{j}})^{log_{b}a-\varepsilon }

            \frac{a^{j}b^{j\varepsilon }}{b^{jlog_{b}a}}b^{j\varepsilon }=(b^{\varepsilon })^{j}(b^{log_{b}a})^{j}=a^{j}

            \cdots         

            得出,g(n)=O(n^{log_{b}a})

 

  •             第二种情况:f(n)=\Theta (n^{log_{b}a})g(n)= f(n),我们求的就是这个项 :\sum_{j=0}^{L-1}a^{j}(\frac{n}{b^{j}})^{log_{b}a}

            把 n^{log_{b}a} 提出来,里面是  \sum_{j=0}^{L-1}a^{j}\frac{1}{b^{j log_{b}a}}

            (b^{log_{b}a})^{j}=a^{j},消掉后 \sum_{j=0}^{L-1}a^{j}\frac{1}{b^{j log_{b}a}} 这个求和就是对一求和,那是多少个一呢 ?

            一共 n^{log_{b}a}*L 个一,这个结果也等同于 n^{log_{b}a}*L=n^{log_{b}a}*log_{b}n

 

  •             第三种情况:f(n)=\Omega (n^{log_{b}a+\varepsilon })g(n)>f(n),我们求对就是这个项:

            这个证明会麻烦一些,因为多了一个条件:af(\frac{n}{b})\leqslant cf(n)

              a^{j}f(\frac{n}{b^{j}})-a^{i-1}(af(\frac{n}{b^{i}}))\leqslant a^{j-1}*cf(\frac{n}{b^{i-1}})       

                                                       \leqslant a^{j-2} * c^{2}f(\frac{n}{b^{j-2}})

                                                        \vdots               \vdots              \vdots

                                                        \leqslant c^{j}f(n)     

              形成一个 c^{j} 的等比数列,而 f(n) 在里头保持不变,可以挪出来。

              而这些等比数列最终加起来也不会超过 \frac{1}{1-c},因此 f(n)*\frac{1}{1-c}  乘的,也是一个常数项,总时间是 \Theta (f(n))

              

              

                                                           

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


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

相关文章

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

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 实战:企业级大数据分析引擎》...

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