电子信息专业,使用c++和python开发过几个项目。但是非科班出身,没有系统的学过数据结构,数据库,计算机协议等。希望从本篇开始,使用博客的形式记录一下重要的专业概念。
时间复杂度概念
简单理解,时间复杂度是衡量代码运行时间的重要指标。
为什么引入时间复杂
如下图所示,随着横坐标(数据规模)的增大,绿色曲线的值(耗费时间)增长最快,其次是蓝色曲线,增长最慢的则是红色曲线。
当然,我们都希望自己的程序像红色曲线一样,面对大规模的输入数据时,仍然可以保持较低的运行时间。
但是,世界上不会存在完美的代码,既不消耗最多的时间,也不占用最多的空间,鱼和熊掌不可得兼,那么我们就需要从中去寻找一个平衡点,使得写出一份较为完美的代码。这时,引入时间复杂度和空间复杂度的计算就成为了必要。
如何计算时间复杂度
由简入繁,看下面代码
int funcl(void)
{
printf("坤坤真帅\n");
return 0;
}
函数的主体部分有两行,每调用一次func1,代码执行两次。使用T(n)表示一段代码的总执行次数,即T(n)=2;
下面我们看一下时间复杂度O(n)与运行次数T(n)的关系:
这段关系可以简单理解为高数中的高阶无穷小。即数据量n趋向无穷大时,一些低次项可被约掉,并且系数在幂指数前面也不值一提,系数也全部约掉,即系数全为1。
显然,此例中T(n)为常数,故时间复杂度为O(1)。
再看一段含有循环的代码
int func2(int n)
{
for(int i=0;i<n;i++)
{
printf("坤坤宇宙第%d帅\n".i)
}
return 0;
}
由于循环语句,每调用一次func2,代码总执行次数T(n)=3n+3;按照时间复杂度O(n)与运行次数T(n)的关系,保留T(n)的最高次项并且去掉最高次项的系数,O(n)=n;
再再看一个双重循环的代码
void func3(int n)
{
for(int i= 0:i< n; ++i)
{
for(int j= 0:j< n; ++j)
{
printf("鸡你实在是太美!\n");
}
}
return 0;
}
由于循环语句,每调用一次func3,代码总执行次数T(n)=n^2+2n+1,O(n)=n^2;
总结
通过此章片面的理解(不正确的),有m重循环,时间复杂度就是O(n)=n^m。但是,这三个例子仅仅是最简单的时间复杂度,还有更复杂的,放在下章说明。