1. 常数阶
O(1)
Temp=i;
i=j;
j=temp;
以上三条单个语句的频度均为1,该程序段的执行时间是一个与问题规模n无关的常数。算法的时间复杂度为常数阶,记作T(n)=O(1)。如果算法的执行时间不随着问题规模n的增加而增长,即使算法中有上千条语句,其执行时间也不过是一个较大的常数。此类算法的时间复杂度是O(1)。
2. 线性阶
a=0 ①
b=1 ②
for(i=1;i<n;i++) ③
{
s=a+b; ④
b=a; ⑤
a=s; ⑥
}
语句1的频度:1
语句2的频度:1
语句3的频度:n
语句4的频度:n-1
语句5的频度:n-1
语句6的频度:n-1
T(n)=O(f(n))=1+1+n+3(n-1)=4n-1=O(n)
3. 平方阶
# 交换i和j
sum=0; # 1
for(i=1;i<=n;i++) # n
{
for(j=1,j<=n,j++) # n^2
{
sum++; # n^2
}
}
T(n)=1+n+n^2+n^2=2n^2+n+1=O(n^2) # 去掉常数,低阶,高阶的系数
4. 立方阶
for(i=0;i<n;i++)
{
for(j=0;j<i;j++)
{
for(k=0;k<j;k++)
{
x=x+2;
}
}
}
i,j,k 最大值均可以取到n-1,所以n-1的三次方为最大执行次数。所以时间复杂度为O(n^3)。
5. 对数阶
i=1;
while(i<=n)
i=i*2;
假设i=n时刚好结束循环
第1次:i=1*2=2
第2次:i=2*2=2^2
3: i=4*2=2^3
4: i=8*2=2^4
...
x: i=n=2^x
x=log2n
f(n)=log2n
T(n)=O(log2n)
在计算时间复杂度时,我们一般使用的大O表示法,其时间复杂度,从小到大的排序是:
(1) < (logn)< (n)< (nlogn)< (n^2)<...< (2^n)< (n!)