#CS010. CSP初赛 时间复杂度

CSP初赛 时间复杂度

递推法求阶乘时间复杂度

int fact(int n){
	if(n == 1)
		return 1;
	return n * fact(n - 1);
}

T(n)={1n=1T(n1)+1n>1T(n)=\begin{cases}1&n=1\\T(n-1)+1&n>1\end{cases}

T(n)=T(n1)+1=T(n2)+2==T(1)+n1=n=O(n)\begin{aligned}T(n) & =T(n-1)+1 \\ & = T(n-2)+2\\ &= \dots \\ &= T(1)+n-1 \\ &= n \\ &= O(n)\end{aligned}

主定理求递归时间复杂度

采用分治策略的代码,通常设计为递归算法来实现,其时间复杂性递归定义一般可写成如下形式。

T(n)={O(1)n=n0aT(nb)+f(nd)n>n0T(n)=\begin{cases}O(1)&n=n_0\\aT(\frac{n}{b})+f(n^d)&n>n_0\end{cases}

a1b>1a≥1,b>1 为常数,f(n)f(n)是正函数。

T(n) 代表了当前层的时间复杂度,n 是问题规模大小。

aa 是原问题的子问题个数nb\frac{n}{b}每个子问题的大小,这里假设每个子问题有相同的规模大小。

f(nd)f(n^d ) 代表了将当前层的数据进行分解和将返回当前层的数据进行合并所需要的时间复杂度。

根据主定理:设 a≥1,b>1 为常数,设 f(n) 是正函数,T(n) 由递归式 T(n)=aT(nb)+f(nd)T(n)=aT(\frac{n}{b})+f(n^d)

T(n) 有如下渐进界:

T(n)={O(nd)d>logbaO(ndlogn)d=logbaO(nlogba)d<logbaT(n)=\begin{cases}O(n^d)& d>log_ba\\O(n^dlogn)&d=log_ba \\ O(n^{log_ba}) & d<log_ba\end{cases}

  • 如果 d>logbad>log_baε>0∃ε>0,有 f(nd)=O(nlogba+ε)f(n^d)=O(n^{log_ba+ε}),且对 c<1∀c<1 与所有足够大的 nn,有 af(nb)cf(n)af(\frac{n}{b})≤cf(n),则 T(n)=O(nd)T(n)=O(n^d)
  • 如果 d=logbad=log_ba,则 T(n)=O(ndlogn)T(n)=O(n^dlogn)
  • 如果 d<logbad<log_baε>0∃ε>0,有 f(nd)=O(nlogbaε)f(n^d)=O(n^{log_ba-ε}),则 T(n)=O(nlogba)T(n)=O(n^{log_ba})

例1

棋盘覆盖问题时间复杂度

T(n)={1n=14T(n2)+1n>1T(n)=\begin{cases}1&n=1\\4T(\frac{n}{2})+1&n>1\end{cases}

a=4,b=2,d=0a=4,b=2,d=0

nlogba=n2n^{log_ba}=n^2

f(n)=1f(n)=1

d<logba\Rightarrow d<log_baT(n)=O(nlogba)=O(n2)T(n)=O(n^{log_ba})=O(n^2)

例2

归并排序时间复杂度

T(n)={1n=12T(n2)+nn>1T(n)=\begin{cases}1&n=1\\2T(\frac{n}{2})+n&n>1\end{cases}

a=2,b=2,d=1a=2,b=2,d=1

d=logbad=log_ba,则T(n)=nlognT(n)=nlogn

例3

T(n)={1n=14T(n2)+n3n>1T(n)=\begin{cases}1&n=1\\4T(\frac{n}{2})+n^3&n>1\end{cases}

a=4,,b=2,d=3a=4,,b=2,d=3

d>logbad>log_ba,此时 ε=1ε=1

f(n)=O(n3)f(n)=O(n^3)

4f(n2)=4(n2)3=n32cf(n)4f(\frac{n}{2})=4(\frac{n}{2})^3=\frac{n^3}{2}≤cf(n)12c<1\frac{1}{2}≤c<1

不能用主定理求解情况

T(n)={1n=12T(n2)+nlognn>1T(n)=\begin{cases}1&n=1\\2T(\frac{n}{2})+nlogn&n>1\end{cases}

nlogba=n,f(n)=nlognn^{log_ba}=n,f(n)=nlogn

d>logba\Rightarrow d>log_ba

但是由于找不到一个常数 εε,使得 f(n)=O(nlogba+ε)f(n)=O(n^{log_ba+ε}),因此不适用主定理。

递归树求递归时间复杂度

对递归树所产生的所有项求和就是递归方程的解。

例1:

快速排序

T(n)={1n=12T(n2)+nn>1T(n)=\begin{cases}1&n=1\\2T(\frac{n}{2})+n&n>1\end{cases}

image

层数共计:kk

k=lognk=logn

T(n)=O(nlogn)T(n)=O(nlogn)

例2:

棋盘覆盖

T(n)={1n=14T(n2)+1n>1T(n)=\begin{cases}1&n=1\\4T(\frac{n}{2})+1&n>1\end{cases}

image

层数共计:kk

k=lognk=logn

T(n)=O(14k14)=O(4k)=O(22k)=O(2logn2)=O(n2)T(n)=O(\frac{1-4^k}{1-4})=O(4^k)=O(2^{2k})=O(2^{logn^2})=O(n^2)

例3:

T(n)={1n=1T(n3)+T(2n3)+nn>1T(n)=\begin{cases}1&n=1\\T(\frac{n}{3})+T(\frac{2n}{3})+n&n>1\end{cases}

image

层数共计:kk

k=log32nk=log_{\frac{3}{2}}n

T(n)=O(nlog32n)=O(nlogn)T(n)=O(nlog_{\frac{3}{2}}n)=O(nlogn)

单项选择题

1.T(n)T(n) 表示某个算法输入规模为n时的运算次数。如果T(1)T(1) 为常数,且有递归式 T(n)=2T(n2)+2nT(n)=2∗T(\frac{n}{2})+2n,那么 T(n)=T(n)=( )。

{{ select(1) }}

  • O(n)O(n)
  • O(nlogn)O(nlogn)
  • O(n2)O(n^2)
  • O(n2logn)O(n^2logn)

2.假设某算法的计算时间表示为递推关系式

T(n)=2T(n4)+nT(n)=2T(\frac{n}{4})+\sqrt{n}

T(1)=1T(1)=1

则算法的时间复杂度为( )。

{{ select(2) }}

  • O(n)O(n)
  • O(n)O(\sqrt{n})
  • O(nlogn)O(\sqrt{n}logn)
  • O(n2)O(n^2)

3.假设某算法的计算时间表示为递推关系式

T(n)=9T(n3)+nT(n)=9T(\frac{n}{3})+n

T(1)=1T(1)=1

则算法的时间复杂度为( )。

{{ select(3) }}

  • O(n)O(n)
  • O(n)O(\sqrt{n})
  • O(n2)O(n^2)
  • O(nlogn)O(\sqrt{n}logn)

4.假设某算法的计算时间表示为递推关系式

T(n)=T(2n3)+1T(n)=T(\frac{2n}{3})+1

T(1)=1T(1)=1

则算法的时间复杂度为( )。

{{ select(4) }}

  • O(n)O(n)
  • O(logn)O(logn)
  • O(n2)O(n^2)
  • O(nlogn)O(\sqrt{n}logn)

5.如果对于所有规模为 nn 的输入,一个算法均恰好进行( )次运算,我们可以说该算法的时间复杂度为O(2n)O(2^n)

{{ select(5) }}

  • 2n+12^{n+1}
  • 3n3^n
  • n2nn2^n
  • 22n2^{2n}