前言

$Master$定理,又称主定理,用于程序的时间复杂度计算,核心思想是分治,近几年$Noip$常考时间复杂度的题目,都需要主定理进行运算。

前置

我们常见的程序时间复杂度有:

$O(n)/O(n2)/O(nlog_2n)/O(2n)$等等...

我们叫它程序的渐进时间复杂度,例如一段程序执行这样的循环:

for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
dist[i][j]=min(dist[i][j],dist[i][k]+dist[k][j]);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
sum+=a[i][j];
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
pai*=a[i][j];

显然,这段代码一共运行了$n3+2n2$次,我们将它的渐进时间复杂度写作$O(n3)$,即保留最高项但忽略其系数,约定:一般我们将$log_2n$写作$logn$,将$logn*logn$写作$log2n$

算时间复杂度有什么用呢?一般来说,在比赛时我们将知道程序的时间限制,一般为$1s$,我们可以通过粗略计算程序时间复杂度来判断程序是否能在$1s$通过,否则会$TLE$。

时间复杂度 $1s$内稳过的范围 极限范围(危险)
$O(1)$ $\infty$ $\infty$
$O(wys)$ $\infty$ $\infty$
$O(logn)$ $\infty$ $\infty$
$O(n)$ $5\times10^7$ $10^8$
$O(nlogn)$ $5\times 10^5$ $10^6$
$O(n^2)$ $5000$ $10000$
$O(n^3)$ 300 500
$O(2^n)$ 25 27
$O(n!)$ 11 11(稳过)
$O(n^n)$ 8 8(稳过)

PS:由于程序存在常数因子,极限范围不一定能过,除非你是欧洲人。

大概来说,如果你算出的渐进时间复杂度量化后在千万级别[$n\times10^7$],基本上是很稳的

对于非递归程序时间复杂度的运算方法,比较简单粗暴的方法是数循环。但这种方法并不一定始终正确,如$NOIP2017PJT4$的二分答案是$O(logn)$复杂度的,$dp$的转移是执行$n$次的,而对于单调队列,每个元素至多进队一次,出队一次,最多与$2n$次操作,$dp$的总操作次数应该是将它们加在一起,共$3n$次操作,时间复杂度为$O(n)$,而不是$O(n^2)$,总复杂度为$O(nlogn)$,与之类似的还有$kmp$算法的时间复杂度。(PS:$kmp$算法的时间复杂度至今仍存在争议,我们一般将其视作$O(n)$的

正文

介绍$master$定理前,首先要知道一个符号

  1. $T(n)$表示时间复杂度,可以这样表示:$T(n)=$一个单项式,例如:

$T(n)=2T(n/2)+f(n)$

  1. $\Theta$ 读音:$theta$,表示等于
  2. $O$ 读音:$big\ oh$,表示小于等于
  3. $o$ 读音:$small\ oh$,表示小于
  4. $\Omega$ 读音:$big\ omega$,表示大于等于
  5. $\omega$ 读音:$small\ omega$,表示大于

主定理是怎么表示的呢?

  • 我们目前有一个规模为$n$的问题
  • 通过分治,我们将问题分成$a$个规模为$\frac{n}{b}$,每次递归将带来$f(n)$的额外计算
  • 于是得到关系式:

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

此外,我们还要定义一个$C_{crit}$,它是这样计算的:

$C_{crit}=log_ba$

那么有:

$1$.

  • 当$f(n)=O(nc)$,且$c<c_{crit}$时有:$T(n)=\Theta(n{c_{crit}})$
  • 例子:
  • $T(n)=8T(\frac{n}{2})+1000n^2$
  • 此时$a=8,b=2,f(n)=1000n^2$
  • 当$c=2$时,$f(n)=O(n^2)$
  • 又因为$C_{crit}=log_ba=3>c$
  • 所以$T(n)=\Theta(n{log_ba})=\Theta(n3)$

$2$.

  • 当$f(n)=O(n^c)$,且$c>c_{crit}$时有:$T(n)=\Theta(f(n))$
  • 例子:
  • $T(n)=2T(\frac{n}{2})+n^2$
  • 此时$a=2,b=2,f(n)=n^2$
  • 当$c=2$时,$f(n)=O(n^2)$
  • 又因为$c_{crit}=log_ba=1<c$
  • 所以$T(n)=\Theta(f(n))=\Theta(n^2)$

$3$.

  • 若存在一个非负整数$k$,使得$f(n)=\Theta(n{c_{crit}}logkn)$
  • 那么$T(n)=\Theta(n{c_{crit}}log{k+1}n)$
  • 例子:
  • $T(n)=2T(\frac{n}{2})+10n$
  • 此时$a=2,b=2,f(n)=10n$;$c_{crit}=log_ba=1$
  • 当$k=0$时$f(n)=\Theta(n1log0n)=\Theta(n)$
  • 所以$T(n)=\Theta(n1log1n)=\Theta(nlogn)$

练手题

  • 首先,我们知道$a=2,b=4,f(n)=\sqrt{n}=n^{\frac{1}{2}}$;$c=\frac{1}{2},c_{crit}=log_42=\frac{1}{2}$
  • 当$k=0$时,满足条件3,所以,$T(n)=O(\sqrt nlogn)$,选$C$

$T(n)$

$=T(n-1)+n-1+n$

$=T(n-2)+n-2+n-1+n$

$=...$

$=T(0)+0+1+2+...+n-2+n-1+n$

$=1+\frac{n\times (n+1)}{2}$

$=O(n^2)$

选择$D$


  • 假设$g(i)$,为计算$F(i)$的次数,因为$F(i)=F(i-1)+F(i-2)$所以$g(i)=g(i-1)+g(i-2)$
  • 因为$F(1)=g(1)=1,F(2)=g(2)=1$,所以$g(n)=F(n)$
  • 则:

$T(n)=g(n)=F(n)=O(F(n))$

选择$D$

完结

这和大家能够平安过初赛!

Master定理学习笔记的更多相关文章

  1. Burnside引理与Polya定理 学习笔记

    原文链接www.cnblogs.com/zhouzhendong/p/Burnside-Polya.html 问题模型 有一个长度为 $n$ 的序列,序列中的每一个元素有 $m$ 种取值. 如果两个序 ...

  2. Lucas定理学习笔记

    从这里开始 一个有趣的问题 扩展Lucas算法 一个有趣的问题 题目大意 给定$n, m, p$,求$C_{n}^{m}$除以$p$后的余数. Subtask#1  $0\leqslant m\leq ...

  3. Matrix_tree Theorem 矩阵树定理学习笔记

    Matrix_tree Theorem: 给定一个无向图, 定义矩阵A A[i][j] = - (<i, j>之间的边数) A[i][i] = 点i的度数 其生成树的个数等于 A的任意n ...

  4. 生成树计数 Matrix-Tree 定理 学习笔记

    一直都知道要用Matrix-Tree定理来解决生成树计数问题,但是拖到今天才来学.博主数学不好也只能跟着各位大佬博客学一下它的应用以及会做题,证明实在是不会. 推荐博客: https://www.cn ...

  5. Ploya定理学习笔记

    由于自己的作息极其不规律导致比赛被打爆了 但是有的时候状态其实还行. 关于Ploya定理其实特别有意思 这里粘一个[dalao的blog](https://blog.csdn.net/lyc16355 ...

  6. Polya 定理 学习笔记

    群 群的定义 我们定义,对于一个集合 \(G\) 以及二元运算 \(\times\),如果满足以下四种性质,那我们就称 \((G,\times)\) 为一个群. 1. 封闭性 对于 \(a\in G, ...

  7. 矩阵树定理&BEST定理学习笔记

    终于学到这个了,本来准备省选前学来着的? 前置知识:矩阵行列式 矩阵树定理 矩阵树定理说的大概就是这样一件事:对于一张无向图 \(G\),我们记 \(D\) 为其度数矩阵,满足 \(D_{i,i}=\ ...

  8. Pólya 定理学习笔记

    在介绍\(Polya\) 定理前,先来介绍一下群论(大概了解一下就好): 群是满足下列要求的集合: 封闭性:即有一个操作使对于这个集合中每个元素操作完都使这个集合中的元素 结合律:即对于上面那个操作有 ...

  9. [HEOI2015]小Z的房间(矩阵树定理学习笔记)

    题目描述 你突然有了一个大房子,房子里面有一些房间.事实上,你的房子可以看做是一个包含n*m个格子的格状矩形,每个格子是一个房间或者是一个柱子.在一开始的时候,相邻的格子之间都有墙隔着. 你想要打通一 ...

随机推荐

  1. 数据结构:Rope

    以BZOJ1507为例,这里仅仅展示动态区间问题的一些典型操作,包括插入删除和修改,查询的话不支持按顺序查询 使用起来很简单很方便 #include<cstdio> #include< ...

  2. linux iptables开放/关闭端口命令

    在CentOS/RHEL 7以前版本上开启端口 #开放端口:8080/sbin/iptables -I INPUT -p tcp --dport 8080 -j ACCEPT#将更改进行保存/etc/ ...

  3. IT培训班123

    最近20年,IT行业一直处于上升期,程序员的工资越来越高了,年薪几十万的程序员大有人在.根据国家统计局发布的2016年各行业平均工资报表,程序员已经是工资最高的一个群体,超过了金融行业. IT行业的火 ...

  4. [bzoj1005][HNOI2008]明明的烦恼-Prufer编码+高精度

    Brief Description 给出标号为1到N的点,以及某些点最终的度数,允许在 任意两点间连线,可产生多少棵度数满足要求的树? Algorithm Design 结论题. 首先可以参考这篇文章 ...

  5. Port-knocking 简单教程

    0. "port knocking" 如字面意思,类似'敲门',只是这里敲的是'端口',而且需要按照顺序'敲'端口.如果敲击规则匹配,则可以让防火墙实时更改策略.从而达到开关防火墙 ...

  6. Java多线程学习(三)volatile关键字

    转载请备注地址:https://blog.csdn.net/qq_34337272/article/details/79680693 系列文章传送门: Java多线程学习(一)Java多线程入门 Ja ...

  7. arch中yaourt的安装和使用

    yaourt-Yet AnOther User Repository Tool Yaourt是archlinux方便使用的关键部件之一,但没有被整合到系统安装中的工具.建议在装完系统重启之后,更新完p ...

  8. Perl6 Bailador框架(3):路径匹配

    use v6; use Bailador; =begin pod 注意的是, 当/:one设置时 虽然你有/admin或/about, 但这个/:one不会跟现有的匹配 只跟没有的匹配: 也就是说, ...

  9. 安全测试===appscan扫描工具介绍

    IBM AppScan该产品是一个领先的 Web 应用安全测试工具,曾以 Watchfire AppScan 的名称享誉业界.Rational AppScan 可自动化 Web 应用的安全漏洞评估工作 ...

  10. nfs 文件共享 服务

    需要rpc服务: [root@xujiaxuan ftp]# service rpcbind start[root@xujiaxuan ftp]# chkconfig rpcbind on 设置开机自 ...