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

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

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

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

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

单层循环

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

int num=0
for(int i=0;i<100;i++)
num++;

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

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

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

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

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

 终止时        i=    n;

 所以           t= log _{2}  n;

 时间复杂度 

                      O( log _{2}  n)

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

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

 循环次数     t=  y;

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

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

                    t=\sqrt{n}-1;

 时间复杂度 

                     O(\sqrt{n}

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

还有下面一种情况

for(int i=0;i<n;i++)
num++;
whilel(m--)
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;   

                                                                                                                                                             

 多层函数

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

void func(int N)
{
  int num=0;
  for(int i=0;i<N;i++)
  for(int j=0;j<N;j++)
   num++;     //显然这个双重函数,两个O(N)相乘,为O(n^2)


  int m=5;    //注意这个常数
  for(int i=0;i<N;i++)//O(N)
  while(M--)  //m是常数这个为O(1)    
   num++;     //这两个循环复杂度O(N)*O(1),还是O(N)
}

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

int count=0;
for(int i=1;i<=N;i+=2)   //外层为O (logN)
for(int j=1;j<=i;j++)    //内层为O (N )
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})

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

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

......

i=2N

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

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

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

for(int i=0;i<N;i++)
for(int j=0;j<=i;j++)
for(int k=0;k<=j;k++)
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

  • 15
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值