主定理

主定理目录 使用主定理求解递归式 算例 证明主定理使用主定理求解递归式主定理是分治算法分析中非常重要的定理 如 我们要处理一个规模为的问题通过分治 得到个规模为的问题 分解子问题和合并子

                                                                                      《目录》


使用主定理求解递归式

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

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

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

在上面这个式子里,我们得要求 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  ,向下取整和向上取整的细节,并不会影响主定理的推导,具体的数学证明,略。

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

 

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

  • 若有实数大于零(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)
  • 若有实数大于零(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} 是渐进意义上的,要差一个因子量级 f(n) 更大,如情况3,则解是 T(n) = \Theta (f(n));注意 f(n) 大于 n^{log_{b}a} 是渐进意义上的,要差一个因子量级 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) 是强于基准的(渐进意义上),
(0)
上一篇 2026年3月20日 上午7:36
下一篇 2026年3月20日 上午7:36


相关推荐

  • 如何配置交换机端口镜像

    如何配置交换机端口镜像1 先将交换机接通电源 console 口与主机相连 2 打开超级终端 windows7 自带 3 弹出的填写位置信息界面点击取消 4 名称任意 图标选第一个 确定 5 选 com1 口下一个界面选择还原为默认值 确定 这时我们就进入了命令控制界面 PS 之前我们做到这一步发现无法输入 键盘好像失灵了 这个时候你可以试试切断交换机电源再连接就可以解决 6 用户名 a

    2026年3月26日
    2
  • if过多如何重构_多个else if用法

    if过多如何重构_多个else if用法介绍最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的if(msgType=”文本”){ //dosomething}elseif(msgType=”图片”){ //doshomething}elseif(msgType=”视频”){ //doshomething}else{ //doshom………

    2022年10月3日
    5
  • ssh配置config文件命令_config文件能删除吗

    ssh配置config文件命令_config文件能删除吗在使用ssh连接服务器时,经常要输入一些不同的主机地址和密码,使用config文件可以很好的解决这个问题。在配置之前我们先生成ssh密钥。#使用以下命令一路回车即可ssh-keygen-trsa#为.ssh目录设置权限chmod600~/.ssh/config文件配置十分简单,只需要按照以下格式配置即可。#config文件需要放到~/.ssh/conf

    2025年5月24日
    4
  • sqlserver不存在或拒绝访问怎么办_sql数据库连接不上

    sqlserver不存在或拒绝访问怎么办_sql数据库连接不上Navicat连接SQLserver数据库时报错:未发现数据源名称并且未指定默认驱动程序导致原因:navicat没有安装sqlserver驱动解决办法:打开Navicat的安装路径,Navicat自带sqlncli_x64.msi,双击安装一下;安装完成之后重启Navicat即可连接成功!…

    2022年10月9日
    3
  • 完整教程:Jenkins 可观测最佳实践

    完整教程:Jenkins 可观测最佳实践

    2026年3月15日
    4
  • gatk过滤_GATK–使用转载

    gatk过滤_GATK–使用转载http blog sciencenet cn blog 1469385 819498 html 文章目录一 准备工作二 流程概览三 流程首先说说 GATK 可以做什么 它主要用于从 sequencing 数据中进行 variantcalli 包括 SNP INDEL 比如现在风行的 exomesequenc 找 variant 一般通过 BWA GATK 的 pipeline 进行数据分析 要 runG

    2026年3月19日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号