提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
一段代码有好有坏,性能各不相同,那么如何来评判一段代码的优劣呢?
一、如何衡量一个算法的效率
任何代码都需要存储,运行,存储需要耗费空间,运行需要时间,实现相同的功能,耗费的空间越少,运行的时间越短,代码质量越高,当然,代码还要兼备可读性,让别人更好地理解你的代码。
二、算法效率的度量
1.时间复杂度T( )
如何评估算法的时间开销?
让算法运行后得出运行时间的方法可行吗?
答案当然是不行!
这样存在什么问题呢?
1.机器性能不同,得出的运行时间不同;
2.越高级的语言执行效率越低(比如C和python)
3.有些算法不可能通过事先运行来得出
这是一个累加和的算法
int main(){
int sum=0,n=100;//执行一次
for(int i=0;i<n;i++){//执行101次
sum+=i;//执行100次
printf("%d\n",sum);// 执行1次
}
printf("sum=%d",sum);//执行一次
}
得出T与n的关系,O(n)=1+101+100+1+1=2n+4=204
其他的T与n的关系,如:
O1(n)=n²+n+1≈n²
O2(n)=n³+n²+n+1≈n³
进一步简化,可得出只保留最高阶的项数,系数化为一
2.空间复杂度S( )
int main(){
int sum=0,n=100;
for(int i=0;i<n;i++){
sum+=i;
printf("%d\n",sum);
}
printf("sum=%d",sum);
}
仍以累加和为例,算法所需的内存空间都是固定的常量,无论n怎么变,算法的空间复杂度始终为O(1)
原地算法的空间复杂度始终为O(1)
如果是一个数组
#include "stdio.h"
int main(){
int sum=0,n=100;
int sum[n];//声明一个长度为n的数组
}
一个int型变量所占的内存空间为4个字节,则所需内存空间为4+4+4n=4n+8;
空间复杂度与时间复杂度类似,保留最高项的阶数,系数化为1,所以空间复杂度为O(n)
如果是一个二维数组
#include "stdio.h"
int main(){
int sum=0,n=100;
int sum[n][n];//声明一个二维数组
}
空间复杂度为O(n)=n²+n+4+4,简化为n²