规则:
1、用常数1取代运行时间中所有加法常数;
2、在修改后的运行次数函数中,只保留最高阶项;
3、如果最高阶项存在且不是1,则去除与这个项相乘的常数。
例1-常数阶:
int i=100; //运行1次
i=100+1; //运行1次
i=100+1; //运行1次
print i;运行1次
f(n)=4 -->O(1)
例2-线性阶:
for(int i=0;i<n;i++){...(O(1))}
f(n)=O(n)
例3-对数阶:
int i=1;
while(i<n){
i=i*2;(O(1))
}
2x=n -->x=log2 n --> O(logn)
例4-平方阶:
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
...(O(1))
}
}
f(n)=O(n2)
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
...(O(1))
}
}
f(n)=O(m*n)
for(int i=0;i<n;i++){
for(int j=i;j<n;j++){ //j=i
...(O(1))
}
}
i=0时,内循环执行n次;i=1时,内循环执行n-1次……当i=n-1时,执行1次
执行总数:n+(n-1)+(n-2)+……+1=n(n+1)/2=n^2/2+n/2
只保留最高项阶->
n
2
2
\frac{n^2}{2}
2n2
去除与最高项相乘的常数->n2
最终时间复杂度为->n2
常见时间复杂度排序:
O(1)<O(logn)<O(n)<O(nlogn)<O(n2)< O(n3)<O(2n)<O(n!)<O(nn)
(n!阶乘123*……*n)
线性表:存、读时O(1);插、删O(n)