1、常数阶:
(1)首先要知道,高斯算法的时间复杂度不是O(3),而是O(1)。根据我们推导大O阶的方法,第一步就是把常数项3改为1。而且没有最高阶项。所以这个算法的时间复杂度为O(1)。
如:
int sum=0,n=100;
sum=(1+n)*n/2;
printf("%d",sum);
答:代码只是3次,4 次......执行的差异,这种与问题的大小(n的值)无关,执行恒定时间的算法,称之为具有O(1)的时间复杂度,又叫常数阶。
注意:不管常数是多少,我们都记作O(1)。
(2)对于分支结构而言,无论是真是假,执行的次数都是恒定的,不受n的影响,所以单纯的分支结构(不包含在循环结构中),其时间复杂度也是O(1)。
2、线性阶:
确定某个算法的阶次,我们常常需要确定某个特定语句或某个语句集运行的次数。因此,我们要分析算法的复杂度,关键就是要分析循环结构的运行情况。
如:
int i;
for(i=0;i<n;i++)
{
/*时间复杂度为O(1)的程序步骤序列*/
}
答:它的循环的时间复杂度为O(n),因为循环体中的代码要执行n次。
3、对数阶:
如:
int count=1;
{
count =count*2;
/*时间复杂度为O(1)的程序步骤序列*/
}
答: 有多少个2相乘后大于n,则会退出循环。则2^x=n,所以这个循环的时间复杂度为O(logn)。
4、平方阶:
简单来说就是循环中带有循环。
比如:第一层循环要执行n次,第二层循环要执行n次,所以它的时间复杂度为O(n*n)。
第一层循环执行了n次,第二层循环只想了m次,所以它的时间复杂度为O(n*m)。
总之,计算时间复杂度就先将代码执行的次数相加,再用大O推导来进行计算。
5、常见的时间复杂度
O(1) < O(logn) <O(n)< O(nlogn)< O(n^2)<O(n^3) <O(2^n) < O(n!) <O(n^n)
常数阶 对数阶 线性阶 nlogn阶 平方阶 立方阶 指数阶 阶乘阶 n^n阶
6、最坏情况与平均情况:
(1) 最坏情况运行时间是一种保证,就是运行时间不会再坏了。在应用中,这是一种最重要的需求,通常,除非特别指定,我们提到的运行时间都是最坏的运行时间。
(2)平均运行时间是所有情况中最有意义的,因为它是期望的运行时间。
(3)对算法的分析,一种方法是计算所有情况的平均值,这种时间复杂度的计算方法称为平均时间复杂度。另一种方法是计算最坏情况下的时间复杂度,这种方法称为最坏时间复杂度。 一般没有特殊说明的情况下,都是指最坏时间复杂度。
7、算法空间复杂度:
(1) 算法的空间复杂度通过计算算法所需的存储空间实现,算法空间复杂度的计算公式记作:S(n)=O(f(n)),其中n为问题的规模,f(n)为语句关于n所占存储空间的函数。
(2)一般情况下,一个程序在计算机上执行时,除了需要存储程序本身的指令、常数、变量和输入数据外,还需要存储对数据操作的存储单元。
a、若输入数据所占空间只取决于问题本身,和算法无关。这样只需要分析该算法在实现时所需的辅助单元即可。
b、若算法执行时所需的辅助空间相对于输入数据量而言是个常数,则称次算法为原地工作,空间复杂度为O(1)。
使用“时间复杂度”来指运行时间的需求,使用“空间复杂度”来指空间需求。