文章目录
- 前言
- 一、时间(空间)复杂度是什么?
- 二、如何计算时间复杂度
- 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的增大,2N+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)=递归次数*每次递归中基本式子的执行次数
示例中的时间复杂度为: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)=递归深度*算法中变量个数
示例中的空间复杂度为O(N)=N
总结
以上就是入门数据结构的时空复杂度的讲解