时间复杂度与时间限制
时间限制
一般会在题目中给出,常见的限制有 1/2/5/20 秒(s),有的时候也会用毫秒(ms)的形式给出。我们一般会
粗略估算计算机一秒钟可以执行 10^8 级别左右的基础运算(加减乘除等)。
假设一道题目时间限制为 1 秒,现在有两个算法都能实现这道题,根据题目输入的 n 的不同:
算法 1 :要进行 n^2 次运算
算法 2: 要进行 10 × n 次运算
那么显然,当 n ≤ 5000 时,两个算法都绰绰有余,而当 n ≤ 10^6 时,第一个算法就没法在时间限制
内得到答案,评测结果就会是超出时间限制。
时间复杂度
表示方法
我们一般用时间复杂度这个概念来描述一个算法的耗时,这个概念详细定义比较复杂,可以简单理解为
时间复杂度就是基础运算的规模,更准确的定义可以参照下面的扩展阅读部分。
表示时间复杂度的渐进符号有多种:大 Θ、大 Ω、小 ω、大 O、小 o 等等,各自有不同的规则。因为
大写字母 O 比较容易打字和书写,所以经常会杂糅这些概念,用大 O 符号来描述算法的时间复杂度上限,通常只保留多项式的最高次项,并省略系数。
一些例子
比如上述的算法 1 与算法 2,我们通常会用 O(n^2) 与 O(n) 来描述
O(n^2)
#include<bits/stdc++.h>
using namespace std;
int n;
int main()
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cout<<"*"<<' ';
}
cout<<endl;
}
return 0;
}
但这样子我们也叫它的时间复杂度为O(n^2):
#include<bits/stdc++.h>
using namespace std;
int n;
int main()
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i;j++)
{
cout<<"*"<<' ';
}
cout<<endl;
}
return 0;
}
所以我们在做题时一定要考虑这道题的时间复杂度与时间限制!时间复杂度与时间限制是帮助我们做题的一个很好的工具(它们可以让我们避开很多坑,比如你以为这道题暴力做能拿满分,但算了时间复杂度后发现超出了时间限制. . . . . .你就不会再傻傻的用了很多时间编了一个暴力程序后信心满满的一提交发现超时了!)。