目录
1.算法和复杂度
1)什么是算法
算法(Algorithm)是指用来操作数据、解决程序问题的一组方法。同一问题可用不同算法解决,而一个算法的质量优劣将影响到算法乃至程序的效率。算法分析的目的在于选择合适算法和改进算法。
2)复杂度
2.时间复杂度
算法的时间复杂度是一个函数式T(N),计算的是大概执行次数,通常用大O渐进法表示
大O渐进表示法
在大O符号表示法中,时间复杂度的公式是: T(n) = O( f(n) ),其中f(n) 表示每行代码执行次数之和,而 O 表示正比例关系,这个公式的全称是:算法的渐进时间复杂度。
注:大O在实际中关注的是任意输入规模的最大运行次数,即最坏情况,也称为上界
规则:
- T(N)中只保留最高阶项,低次项对函数式影响较小可以省略
- 如果最高项存在且不是1,则去除常系数
- T(N)中无N相关项,只有常数项,用1取代所有常数
常数阶O(1)
void Fun(int N)
{
int count=0;
for(int k=0;k<100;k++)
{
++count;
}
}
从这段代码来看,T(N)=100,所以时间复杂度O(1)
线性阶O(N)
for(int i=0;i<n;i++)
{
i++;
}
时间复杂度O(n)
平方阶O(N^2)
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
printf("%d",arr[i][j]);
}
}
时间复杂度O(N^2)
对数阶O(logN)
void Fun(int n)
{
int cnt=1;
while(cnt<n)
{
cnt*2=n;
}
}
一般情况下底数忽略:O(logN)
递归情况
//计算递归阶乘复杂度
long long Fac(size_t N)
{
if(N==0)
return 1;
return Fac(N-1)*N;
}
因为递归过程不断进行函数的自身引用,执行次数应相加,总空间复杂度=单次递归时间复杂度*递归次数
所以时间复杂度=O(N)
常见复杂度对比
O(1)<O(logN)<O(N)<O(N*logN)<O(N^2)<O(N^3)
复杂度升序,执行速度也越来越慢
3.空间复杂度
使用大O法,计算额外临时开辟的空间大小
O(1)
int i=0;
for(i=0;i<10;i++)
{
i++;
}
代码中的 i 所分配的空间都不随着处理数据量变化,因此它的空间复杂度 S(n) = O(1)
O(N)
举例:递归引用
递归程序中,不断创建空间进行程序递归引用计算,所以空间复杂度为O(N)