文章目录

  • 前言
  • 一、时间(空间)复杂度是什么?
  • 二、如何计算时间复杂度
  • 1.普遍情况下时间复杂度的计算
  • 2.特殊情况下时间复杂度的计算
  • 3.递归函数的时间复杂度
  • 三、如何计算空间复杂度
  • 1.普遍情况下空间复杂度的计算
  • 2.递归函数的空间复杂度
  • 总结



前言

本文将带你全面了解时空复杂度,走进C语言数据结构的第一课


一、时间(空间)复杂度是什么?

时间复杂度与空间复杂度都是一个含N的式子。他们用来度量一段代码对时间空间的利用效率。
在数据结构中,我们往往以此来判断一个算法的优劣,并以此为根据优化我们自己的代码

二、如何计算时间复杂度

时间复杂度是由代码中最基本式子所执行的次数决定

1.普遍情况下时间复杂度的计算

代码如下:

void (int N)
{  int i,j,B=0;
for(i=0;i<N;i++)
{for(j=0;i<N;i++)
B++;
}
for(i=0;i<2*N;i++)
B++;
for(i=0;i<10;i++)
B++;
}

在第一个循环中,其最基本式子B++;执行了N^2次
在第二个循环中,其最基本式子B++;执行了N2次
在第三个循环中,其最基本式子B++;执行了10次
最精确的时间复杂度为F(N)=N^2+2N+10
而随着N的增大,2
N+10与N^2在时间复杂度中所占权重比例差距越来越大,所以我们一般选择精准时间复杂度中N的最高阶作为衡量其所需时间的判断
实际时间复杂度为O(N)=N^2

2.特殊情况下时间复杂度的计算

代码如下:

strchar(const char*str,char character)	
{while(*str)
{if(str==character)
	return str;
	str++;
} 
}

有时我们的函数在循环中会根据不同的输入情况,随时中断函数的执行
此时,这种函数的时间复杂度则分为了3种情况
1.在循环进入时便结束循环
如:输入:abcdefg,a
其时间复杂度为:F(N)=1
2.在循环末才结束循环
如:输入:abcdefg,g
其时间复杂度为:F(N)=N
3.在循环中任一时刻结束循环
如:输入:abcdefg,d
其时间复杂度为:F(N)=4
由于我们在对一代码进行评估时,往往要考虑最坏情况
所以我们采用悲观预期,即选取最坏情况的时间复杂度作为其时间复杂度
实际时间复杂度为O(N)=N

3.递归函数的时间复杂度

代码如下:

int Fibon(int n)
{
   if (n == 1|| n == 2)
   {
	   return 1;
   }
   else
   {
	   return Fibon(n-1)+ Fibon(n-2);
   }
}

有时我们的函数在循环中需要不断递归

此时,这种函数的时间复杂度计算公式为

F(N)=递归次数*每次递归中基本式子的执行次数

java算法时间复杂度怎么算 时间复杂度代码实现_i++

示例中的时间复杂度为:O(N)=N^2

三、如何计算空间复杂度

空间复杂度由代码中所需要额外开辟的空间决定

1.普遍情况下空间复杂度的计算

代码如下:

void (int N)
{
int i,j,B=0;
for(i=0;i<N;i++)
{for(j=0;i<N;i++)
B++;
}
for(i=0;i<2*N;i++)
B++;
for(i=0;i<10;i++)
B++
}

在代码中,N为形参,并不占用额外空间
而i,j,B是在执行函数时所重新定义的变量 ,由其决定空间复杂度
最精确的空间复杂度为F(N)=3
同时间复杂度一样,空间复杂度也选取精准空间复杂度中N的最高阶作为衡量其所需时间的判断
所以其
空间复杂度为O(1)

2.递归函数的空间复杂度

代码如下:

int Fibon(int n)
{
   if (n == 1|| n == 2)
   {
	   return 1;
   }
   else
   {
	   return Fibon(n-1)+ Fibon(n-2);
   }
}

有时我们的函数在循环中需要不断递归,建立栈帧

此时,这种函数的空间复杂度计算公式为

F(N)=递归深度*算法中变量个数

java算法时间复杂度怎么算 时间复杂度代码实现_时间复杂度_02

示例中的空间复杂度为O(N)=N


总结

以上就是入门数据结构的时空复杂度的讲解