目录
一、前言
用不同方式达到同一目的,每个方式达到目的所用的时间和空间是不同的。在程序上,使用不同算法来获取结果所需的时间和空间也是不同的。时间复杂度和空间复杂度主要功能就是判断算法的好坏,也可以说算法效率的高低。
时间复杂度主要用于衡量一个算法的运行快慢,空间复杂度主要用于衡量一个算法运行所需要的额外空间。
二、时间复杂度
1.时间复杂度的概念
那时间复杂度我们怎么判断和得出呢?
由最简单的循环来看:
int css(int n)
{
int b = 0;
for (int i = 0; i < n; i++)
{
b++;
}
return b;
}
在循环中,n的大小是不是决定了b++的执行次数。
当n只有确定大小时,是不是只有给足程序执行的时间,b++操作总有执行结束的一天。而区别不就是n较小时很快就可以得到结果,n大2时就需要比较长的时间。而时间复杂度就是看算法中基本操作的执行次数。
或许会疑问,时间复杂度不是用来衡量一个算法的运行快慢吗?为什么不直接用运行时间来作为时间复杂度?
我们知道时间复杂度的出现是为了衡量不同算法为了达到同一目的的效率。如果要用运行时间来判断,那就要保持各种条件的统一,比如运行环境一样,但我们没办法达到算法运行时各种条件都一致。因此,我们通过来看算法中基本操作的执行次数来作为时间复杂度。这样就摆脱了外界条件的影响,而只追求算法本身。
而上述代码中,b++就是基本操作。为什么不是int b=0;语句呢?因为在有循环的条件下,int b=0;
语句的执行所需时间很小(对于循环操作而言),因此,虽然int b=0;也是基本操作,但在求时间复杂度时会对其进行忽略。
那是不是我们在求算法运行的时间复杂度时,就可以忽略那些执行时间很小的语句呢?
没错,实际我们计算时间复杂度时,我们并不是要计算精确的执行次数,而只需要大概的执行次数,这就不得不提到时间复杂度的表示方法一一大O的渐进表示法。
而求时间复杂度第一步:得出次数函数,并将小的值忽略(未知数不能忽略)。