数据结构学习一:时间复杂度O(f(n))

时间复杂度:

定义:

一个语句的频度是指该语句在算法中被重复执行的次数。
误区:
切勿使用绝对时间来衡量算法的效率;
如:
时间复杂度是指本地计算机执行该段代码的绝对时间。(×)

解决措施:
仅关心可执行语句(基本操作),不必考虑陈述语句。
那么如何快速又准确的判断基本操作:
在多数情况下,基本操作是最深层循环内的可执行语句。

分析时间复杂度的规则:

乘法规则:
T(n)=T1(n)+T2(n)=O(f(n))+O(g(n))=O(max(f(n),g(n)))
加法规则:
T(n)=T1(n)*T2(n)=O(f(n))*O(g(n))=O(f(n)*g(n))

常用的渐进时间复杂度:

O(1)<O(n)<O(log2n)<O(nlog2n)<O(n²)<O(n³)<O(2^n)<O(n!)

O(n)的时间复杂度高于O(logn) (√)
O(n)的时间复杂度优于O(logn) (×)

时间复杂度的计算:

例1:
下列程序段的时间复杂度( C).

count=o;
for(k=1;k<=n;k*=2)
   for(j=1;j<=n;j++)
      count++;

A.O(log2n) B.O(n) C.O(nlog2n) D.O(n²)
解析:
1.先找内层循环条件 j<=n,发现与外层循环的变量k无关,每次循环j自增1,及每次内循环都执行n次。
2.找外层循环条件为k<=n,增量定义为k*=2(k=k*2),可知每次循环次数为2^k<=n,即k<=log2n。
3.所以内层循环时间复杂度O(n),外层循环复杂度O(log2n),对于嵌套循环,使用乘法规律,该程序的时间复杂度为T(n)= O(nlog2n)。

例2:
以下算法中加下划线的我语句执行次数为(A)。

int m=0,i,j;
for(i=1;i<=n;i++)
   for(j=1;j<=2*i;j++)
      m++(下划线)

A.n(n+1) B.n C.n+1 D.n²
解析:
m++属于内层循环,即m++的执行次数=内层循环的执行次数。
1.内循环条件j<=2i,与外层循环的变量i有关。先求外循环的执行次数。
2.外循环的条件i<=n,且每循环i自增1,即外循环执行次数为n,i=n(n+1)/2,内循环条件为j<=2
i,即j<=2*n(n+1)/2=n(n+1)
即为m++的执行次数n(n+1)

求和公式
m++语句的执行次数:Σ(i=1,n)*Σ(i=1,n=2i)=Σ(i=1,n)*2i=2Σ(j=1,n)*i=n(n+1)

例3.如下函数mergesort()执行的时间复杂度为多少?
(假设函数调用被写成mergesort(1,n),即函数merge()的时间复杂度为O(n))。

void mergesort(int i.int j)
{
   intm;
   if(i!=j)
   {
      m=(i+j)/2;
      mergesort(i,m);
      mergesort(m+i,j);
      merge(i,j,m);//本函数的时间复杂度为O(n)。
   }
}

显示规模为n,基本操作式mergesort().
复杂度为O(n),merge的基本操作为cn。
函数mergesort()基本操作次数为f(n).

在这里插入图片描述
由函数mergesort()可知f(1)=c1=c
由n=2
k得 k=log2n
带入最后一式。
f(n)=cn+nlog2n
即时间复杂度为O(nlog2n)。

当进入mergesort(i,m)或mergesort(m+1,j)函数时,merge()函数处理得序列变成原来的一半,基本操作也变为原来的一半。依次类推,内层循环的基本操作次数是外层循环的一半。

以上都是个人做题的总结。如有错误欢迎大家指正。我是yyyloki。

猜你喜欢

转载自blog.csdn.net/weixin_43787365/article/details/104803121