当前位置:   article > 正文

数据结构—— 时间复杂度计算_数据结构时间复杂度怎么计算

数据结构时间复杂度怎么计算

时间复杂度抽象的表示了算法执行的基本操作次数,用来描述算法运行时间和输入数据量之间的关系。而大O符号,正式称呼为"大O表示法",是表示时间复杂度的一种方法,他给出了算法运行时间随着输入规模增长的上界,是我们可以比较不同算法的效率。 

下面是一些例子更好了解大O法。

关于它的计算可以分为以下几种:

 非递归单层循环O(1)
O(u)
O(\sqrt[n]{u})
O(log_{m} U)
多层循环直观
计算
 递归主定理T(n)=aT(\frac{n}{b})+f(n)
树状图

单层循环

一般分为,表格中四种情况。下边结合代码,让你更清楚的理解。

  1. int num=0
  2. for(int i=0;i<100;i++)
  3. num++;

 显然这个进行了100次++,这是一个常数值,常数值的复杂度就是O(1),

如果将100换成N,N是一个变量,在求复杂度时,默认N是一个无限大的数,所以复杂度是O(N).如果换成\frac{N}{2},当N无穷大时,不考虑系数,主要看次数,都是一次,属于同一阶层,(可以类比一下高数中的高阶低阶无穷小,次数相同时,属于同阶无穷小),所以还是O(N)

下边是关于表格中的后两种的例子,如果难看出来的话,可以列一下方程等式,如下:

  1. int i=1;
  2. while(i<=n)
  3. i=i*2;

 循环次数    t= log _{2}  i;

 终止时        i=    n;

 所以           t= log _{2}  n;

 时间复杂度 

                      O( log _{2}  n)

一般默认log n(底数为2时),就是log _{2}  n

  1. y=0;
  2. while((y+1)*(y+1)<=n)
  3. y+=1;

 循环次数     t=  y;

 终止时        (y+1)^{2}= n  ;

 所以            (t+1)^{2}= n  ;

                    t=\sqrt{n}-1;

 时间复杂度 

                     O(\sqrt{n}

-1,在这里就可以直接忽略了

还有下面一种情况

  1. for(int i=0;i<n;i++)
  2. num++;
  3. whilel(m--)
  4. num*=2;

这个有两种写法

O(n)+O(m)

或者O(max(n,m)) 。

如果将m改成5,因为n无穷大,所以直接取O(n)就行了

 不同复杂度的大小:O(n!)>O(2^{n})>O(n^{2})>O(nlogn)>O(n)>O(log n)>O(1)

(在考研中,最坏和平均复杂度可以当成一回事 ,二者 等价。一个博主说的,我也不太懂)

在单层循环中,还有一种二分查找,有n个数据 ,所以2^{k}=n;查找k次,复杂度是log n;   

                                                                                                                                                             

 多层函数

一种通过对单层函数进行相乘

  1. void func(int N)
  2. {
  3. int num=0;
  4. for(int i=0;i<N;i++)
  5. for(int j=0;j<N;j++)
  6. num++; //显然这个双重函数,两个O(N)相乘,为O(n^2)
  7. int m=5; //注意这个常数
  8. for(int i=0;i<N;i++)//O(N)
  9. while(M--) //m是常数这个为O(1)
  10. num++; //这两个循环复杂度O(N)*O(1),还是O(N)
  11. }

整个函数,复杂度为O(N^{2})+O(N).。由于之前提到的只看最高次,所以复杂度写成O( N^{2}

  1. int count=0;
  2. for(int i=1;i<=N;i+=2) //外层为O (logN)
  3. for(int j=1;j<=i;j++) //内层为O (N )
  4. count++; //整体就是O(Nlog N)

 这也是,可以直观看出来的复杂度,外内层相乘。

另一种需要计算,等差,等比数列的和.....

外层循环i=1i=2i=4i=6......i=N
内层循环次数1246

......

i=N

显然这是一个等差数列 ,所以sum=(1+N)/2*N=N/2+N^2/2;只看最高次,忽略系数

所以时间复杂度为O(N^{2})。

冒泡排序也是O(N^{2})

  1. for(int i=1;i<=N;i*=2)
  2. for(int j=1;j<=i;j++)
  3. n++;

外层循环i=1i=2i=4i=8......i=N
内层循环次数1248

......

i=2N

显然这是一个等比数列 ,结合下图等比数列求和,

 所以sum=1*(1-2^logN)/(1-2)=2N-1;只看最高次,忽略系数

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

  1. for(int i=0;i<N;i++)
  2. for(int j=0;j<=i;j++)
  3. for(int k=0;k<=j;k++)
  4. n++;

对于一些三层循环,可以类比,两重循环,可以看作是平面面积,三层循环可以看作体积如下图

复杂度也就是O(N^{3})

递归

主定理,T(n)=aT(\frac{n}{b})+f(n),一般解决b>1;

树状图,b=1,比如T(n)=T(n-1)+n,这种只能用树状图解决

关于递归的我也不太清楚,我说明一下,这里有部分内容是我学习借鉴的一个视频里的,

链接我放下边了,想了解的可以看一下,不过视频里我发现存在一点问题,关于等差数列的,这个需要注意。

【考研数据结构之时间复杂度(含递归)-哔哩哔哩】 https://b23.tv/KhGGgvx

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/神奇cpp/article/detail/842005
推荐阅读
相关标签
  

闽ICP备14008679号