一、时间复杂度
1.时间复杂度的概念
时间复杂度是一个函数,用于描述某种算法所需的运行时间。常用大O表述。
2.计算时间复杂度的意义
- 避免代码运行出现TLE。
- 通过计算时间复杂度反推算法内容:推荐博客yxc。
3.如何粗略计算时间复杂度
当n很大的时候,常数项,系数和低阶项可以忽略。
因为n很大时,原函数与忽略这些因素后得到的函数计算出的结果差别不是很大,影响较小。
举例1
#include<iostream>
using namespace std;
int main(){
int n;//执行了1次
cin>>n;//执行了1次
for(int i=0;i<n;i++)//i=0执行了1次,i<n执行了n+1次,i++执行了n次
cout<<1;//执行了n次
return 0;
}
其数据范围0<=n<=105。
其中语句执行次数为3n+4,即T(n)=3n+4 (T(n) : 语句频度的符号,表示一个算法的语句执行次数)
当n很大时,可以用O(n)表述,即3n+4用n的时间复杂度表示,即O(n)=105。
举例2
#include<iostream>
using namespace std;
int main(){
int n,m;//执行1次
cin>>n>>m;//执行1次
for(int i=0;i<n;i++){//i=0执行了1次,i<n执行了n+1次,i++执行了n次
for(int j=0;j<m;j++){//j=0执行了1次,j<m执行了m+1次,j++执行了m次
cout<<1;//执行mn次
}
}
return 0;
其数据范围0 <= n <= 103,0 <= m <= 103;
其中T(n)=mn+2n+2m+6,忽略其中的系数,低阶项,常数项后用O(nm)表示,即大O(nm)=106.
而一台测评机一般每秒执行109语句,时间复杂度在107~108最佳。
代码运行超时有两种情况 :
- TLE代码运行超时且结果正确
- WA代码运行超时但结果不正确
4. 常用的函数阶
符号 | 名称 |
---|---|
O(1) | 常数 |
O(n) | 线性 |
O(n2) | 平方 |
O(logn) | 对数 |
O(nlogn) | 线性对数 |
O(cn) | 指数 |
O(n!) | 阶乘 |