基于Master定理的时间复杂度分析

Master定理是一种求解递归型程序的时间复杂度的方法。在介绍Master定理前,我们先引入时间复杂度的概念。

引言——时间复杂度

时间复杂度是衡量程序运行快慢的一个指标,为一个程序语句的执行次数。本文中我们介绍的是渐进的时间复杂度,即对于一个具有多项式的时间复杂度,我们仅取其最高的时间复杂度而忽略掉常数及其它项。

eg.如果一个程序的时间复杂度T(n)=n^3+3n^2+7,那么我们认为这个程序的时间复杂度为O(n^3).

时间复杂度的分析有多种符号表示,在本文中,我们一律看成O()

Master定理

对于非递归的程序,时间复杂度是很好分析的,只需数一数循环次数就行。

对于递归型程序,我们需要用到Master定理进行分析。

Master定理:对于一个规模为n的问题,通过分治将每个问题分解成a个规模为\frac{n}{b}的子问题,每次递归带来的额外运算为f(n),那么可得到它的时间复杂度关系式:T(n)=aT(\frac{n}{b})+f(n).

此外,我们定义一个参数c_{crit},且c_{crit}=log{_{b}}^{a},我们通过对T(n)的变形来说明c_{crit}的含义。

  •  

以下为口胡“证明”,仅帮助理解,不可作为严谨证明:

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

=a(aT(\frac{n}{b^2})+f(\frac{n}{b}))+f(n) 

=a(a(a(T(\frac{n}{b^3})+f(\frac{n}{b^2})))+f(\frac{n}{b}))+f(n)

=a^aT(\frac{n}{b^a})+a^{a-1}f(\frac{n}{b^{a-1}})+...+a*f(\frac{n}{b})+f(n)

f(n)=n*w,那么:

=w\sum_{i=0}^{a}a^{a-i}*\frac{n}{b^{a-i}}

n=b^a,得:

=w\sum_{i=0}^{a}a^{a-i}*b^i

=wa^a\sum_{i=0}^{a}(\frac{b}{a})^i

a^a=a^{log{_{b}}^{n}}=n^{log{_{b}}^{a}},故:

T(n)=wn^{log{_{b}}^{a}}\sum_{i=0}^{n}(\frac{b}{a})^i

所以我们可以看出:T(n)n^{c_{crit}}有关。

由于上文中我们说过:时间复杂度取渐进的T(n),所以若f(n)=O(n^c),我们只需比较n^{c_{crit}}n^c的大小,取较大的即可。

  •  
  1. f(n)=O(n^c)c<c_{crit},那么T(n)=O(n^{c_{crit}})
  2. 若存在非负整数k,使得f(n)=O(n^{c_{crit}}log^kn),那么T(n)=O(n^{c_{crit}}log^{k+1}n)
  3. f(n)=O(n^c)c>c_{crit},那么T(n)=O(f(n))

第一第三条是比较好理解的,但第二条就需要死记硬背了。

当然,Master定理还有其它内容,不过我实在写不动了,有兴趣的同学可以看下这篇文章:https://www.luogu.org/blog/Chanis/master ,此篇解释的更为全面;

关于Master定理的证明:http://www.doc88.com/p-9761826142176.html。

你可能感兴趣的:(初赛备考,Trick)