本文学习自 狄泰软件学院 唐佐林老师的 数据结构课程
问题:我们已经有了估算算法复杂性的方法,那么如何用符号定性的判断算法的效率呢?
算法复杂度的概念:算法的复杂度
- 时间复杂度:算法运行后对时间需求量的定性描述
- 空间复杂度:算法运行后对空间需求量的定性描述
注意:数据结构课程重点关注的是算法的效率问题,因此,整个课程会集中于讨论算法的“时间复杂度”,但是使用的方法完全可以用于空间复杂度的判断
大O表示法
- 算法效率严重依赖于操作(Operation)数量!!!0(n)
- 操作数量的估算可以作为时间复杂度的估算
- 在判断时首先关注操作数量的最高次项
如下表示同一数量级的操作数量
O(5) = O(1)
O(2n+1) = O(2n) = (n)
O(n*n+n+1) = O(n*n)
O(3n*n*n+1) = O(3n*n*n) = O(n*n*n)
常见的时间复杂度:
线性阶时间复杂度:O(n)
for(int i=0; i<n; i++){
//复杂度为O(1)的程序语句
}
循环次数:n
对数阶时间复杂度:O(log n)
int i=1;
while(i < n){
//复杂度为O(1)的程序语句
i*=2;
}
循环次数:log(2)(n)
平方阶时间复杂度:O(n*n)
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
//复杂度为O(1)的程序语句
}
}
循环次数:n*n
时间复杂度计算练习举例:
练习 1
for(int i=0; i<n; i++){
for(int j=i; j<n; j++){
//复杂度为O(1)的程序语句
}
}
当 i=0,做了n次操作
当 i=1,做了n-1次操作
当 i=2,做了n-2次操作
...
最终作了 n+(n-1)+(n-2)+(n-3)+....1 = (n*(n+1))/2,所以时间复杂度是 O(n*n)
练习2
void func1(int n)
{
int i=0;
while(i<n){ //此处 while 每次执行都需要操作n+1次,所以执行n次的操作数量为:(n+1)*n,所以时间复杂度为 :O(n*n+n) = O(n*n)
m(n);//由操作数量(n)计算可知,此处需要操作 n次
i++; //操作1次
}
}
void m(int n)
{
int i=0;
while(i<n){{
cout << i <<endl;
}
}
小结:
- 时间复杂度是算法运行时对时间的需求量
- 大O表示法用于描述算法的时间复杂度
- 大O表示法只关注操作数量的最高次项
- 常见的时间复杂度为:线性阶,平方阶,对数阶

被折叠的 条评论
为什么被折叠?



