渐进时间复杂度

时间复杂度

1.概念

     渐进时间复杂度(时间复杂度)是算法效率的度量。在一般情况下,算法基本操作重复执行的次数用T(n)表示。同时用一个辅助函数f(n),T(n)/f(n)!=0,那么f(n)是T(n)的同数量级函数,T(n)=O(f(n)),这就称为渐进时间复杂度。


2.大(O)表示法

     T(n)=O(f(n))称为大(O)表示法。算法的复杂度可以从最优、最坏、平均三个角度来评估,一般以最坏角度来进行时间复杂度的评估。大(O)表示法的时间复杂度的函数阶一般有以下几种情况,分别是O(1),O(n),O(nx),O(log2n),O(nlog2n)等等。并且如果函数阶里同时出现多种函数组合,则以阶数最大的函数作为时间复杂度。并且如果函数系数非1,则化为1。


3.时间复杂度实例

3.1 常数阶 

int sum=0,n=10;//执行1次
sum+=n*(n+1);//执行1次
sum++;//执行1次
cout<<sum;//执行1次

       此段代码执行4次,执行次数与n并无关系,所以根据大(O)表示法推导,我们应该将4改为1,即结果都应该为O(1)。

3.2 线性阶

int sum=0;
for(int i=0;i<n;i++){
    sum++;
    cout<<sum;
}

        此段代码是单层循环,运行了n次,所以时间负责度是O(n)。

3.3 对数阶

int num=1;
while(num<n){
     num*=2;
}

        num初始值为1,不断自乘2逼近n,设循环次数为x,由数学公式2x=n,x=log2n次。

3.4 平方阶

int n=10;
for(int i=0;i<n;i++)
   for(int j=10;j>i;j--){
   }
}

       由上述线性阶的时间复杂度说明容易得知在外层循环中,时间复杂度为O(n),再经过内层循环,两个O(n*n)的结果为O(n2),幂次阶同理。

3.4 阶乘阶

int fac(int n){
    cout<<n*fac(n-1);
}

        以上代码是一个阶乘函数,顾名思义,为O(n!)。

4.复杂度图表比较


n

l  ogn
nlogn

2ⁿ
n!
5
2 10 25 32 120
10 3 30 100 1024
50 5 250 2500 约10^15


约3.0*10^64

100 6 600 10000 约10^30

约9.3*10^157
1000 9 9000 1000 000 约1

约4.0*10^2567





常用的时间复杂度按照耗费的时间从小到大依次是:O(1)<O(logn)<O(n)<O(nlogn)<O(n²)<O(n³)<O(2ⁿ)<O(n!)

参考来源:

1.数据结构

2.大话数据结构

约3.0*10^64

猜你喜欢

转载自blog.csdn.net/weixin_39596963/article/details/80987779