算法时间复杂度O(1)、O(logn)、O(n)、O(nlogn)、O(n^2)、O(n^3)、O(2^n)、O(n阶乘)

举报
黑色地带(崛起) 发表于 2023/02/16 14:37:28 2023/02/16
【摘要】 例题才是最好的老师?算法时间复杂度O(1)、O(logn)、O(n)、O(nlogn)、O(n^2)、O(n^3)、O(2^n)、O(n阶乘)

例题才是最好的老师?算法时间复杂度O(1)、O(logn)、O(n)、O(nlogn)、O(n^2)、O(n^3)、O(2^n)、O(n阶乘)

 目录

基础常识:

保最大,去系数

常见的八种时间复杂度类型:

(1)O(1)

(2)O(logn)

(3)O(n)

(4)O(nlogn)

(5)O(n^2)

(6)O(n^3)

(7)O(2^n)

(8)O(n!)


注:此博客以基础例题为例,掌握基本的时间复杂度计算。(在做题中学习)


编辑


基础常识:

保最大,去系数

删掉小项,只保留对时间复杂度影响最大的项------->再去掉系数


时间复杂度所耗费时间从小到大依次是:

O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(n3)<O(2n)<O(n!)<O(nn)


编辑


常见的八种时间复杂度类型:

(1)O(1)

常量阶,运行时间为常量

int a=1        //执行1次

print(a)        //执行1次

T(N)=1+1=O(1)




(2)O(logn)

对数阶,二分搜索算法等

i=n;                        //执行1次

while(i>0)  i=i/2;        //设执行了k次

以8为例:8*1/2=4----->4*1/2=2----->2*1/2=1

(1是最小元素,已经不可再分)

即8*(1/2)^3=1


综上:

有n个元素,即i=n,设执行了k次

===》  n*(1/2)^k=1

==》  n=2^k

==》 k=log(2)n

所以时间复杂度为O(logn)

编辑




(3)O(n)

线性阶,如n个数内找最大值

int i , n = 1000, sum = 0;        //执行1次

for( i=0; i < n; i++ )                //执行n+1次

{

        sum = sum + i;        //执行n次

}

T(N)=1+(n+1)+n------>O(n)

(保最大,去系数)




(4)O(nlogn)

对数阶,如快速排序算法

for(int i=1;i<=n;i++)        // 执行n次

{

          for(int j=1;j<=n;j+=i)        //

           { }

}

通过第二个式子对i和n之间的关系进行分析:

(1)当i=1时,执行n次;

(2)当i=2时,执行n/2次;

 .............

(4)当i=n-1时,执行n/n-1次;

(5)当i=n时,执行n/n次;


第二个式子:

执行n(1 +1/2+1/3 +1/4 + 1/5+ 1/6+1/7+1/8 +...1/n)次

(查阅资料知)

这是一个调和级数

1+1/2+1/3+1/4+...+1/n= ln(n+1)+r(r为常量)


n(1 +1/2+1/3 +1/4 + 1/5+ 1/6+1/7+1/8 +...1/n)

=n(ln(n+1) + r)

=nln(n+1)+rn

所以时间复杂度为O(nlogn)

编辑





(5)O(n^2)

平方阶,如选择排序,冒泡排序

int i, j, n = 1000;                //执行1次

for( i=0; i < n; i++ )               //执行n+1次

{

        for( j=0; j < n; j++ )        //执行n(n+1)次

        {

        print(j);                //执行n(n+1)次

        }

}

T(N)=1+(n+1)+2n(n+1)------>O(n^2)

(保最大,去系数)




(6)O(n^3)

立方阶,如两个n阶矩阵的乘法运算

int a, b,c,long sum = 0                //执行1次
      for (int x = 0; x < a; x++)                //执行n+1次
        for (int y = 0; y < b; y++)                //执行n(n+1)次
          for(int z=0;z<c;z++)                //执行(n+1)n^2次

        sum=a*b*c                        //执行n^3次

T(n)=1+(n+1)+n(n+1)+n^2(n+1)+n^3

=O(n^3)



(7)O(2^n)

指数阶,如n个元素集合的所有子集的算法

int i = 1, n = 1000;        //1

while( i < n )                //设执行x次

{

        i = i * 2;                

}

设执行x次i=n,即2^x=n--->x=log(2)n

T(N)=O(log(2)n)-------->(原来这个不是)

编辑


for(int i=0;i<pow(2,n);i++)
{
……
}

for(int i=0;i<pow(n,n);i++)
{
……
}

多项式最大阶:
f(n)=a1*n^m+a2*n^(m-1)+.an-1*n+an
时间复杂度T(f(n))=O(n^m)

时间步法

一个函数g(n),一个自然数n0,使f(n)<=n0*g(n)

有T(f(n))=O(g(n)),简称为T(n)=O(g(n))

(1)f(n)=n+2log2n<=n+2n=3n=3*g(n)==>T(n)=O(n)

(2)6n^2-12n+1<=6n^2-n^2(n>=12)=7n^2=7*g(n)==>T(n)=O(n^2)

(3)n(n+1)(n+2)/6<=n(n+1)(n+2)=n(n^2+3^n+2)=n^3+3n^2+2n<=n^3+4n^2(n>=n0=2时)<=2n^3(n>=n0=4)=2*g(n)===>T(n)=O(n^3)

(4)2^(n+1)+100n<=2*2^n+n*2^7<=3*2^n=3*g(n)==>T(n)=O(2^n)

编辑




(8)O(n!)

阶乘阶,如n个元素全部排列的算法

int fac(int n)

{ if n == 1 or n == 0

{ return 1;}

else

{ return n*fac(n-1); }

}


T(n)=

O(1),n≤1

T(n−1)+O(1),n>1​


T(n)=T(n−1)+O(1)          

=T(n−2)+2O(1)      

 =...=T(1)+(n−1)O(1)    

  =O(1)+(n−1)O(1)=O(n)

编辑

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。