1.时间复杂度
一、时间复杂度的概念
一个算法所需要的运算时间通常与所解决问题的规模大小有关。问题规模是一个和输入有关的量,通常把算法运行的时间T表示为n的函数,记为T(n)。不同的T(n)算法,当n增长时,运算时间增长的快慢很不相同。一个算法所需执行的时间就是该算法所有语句执行次数之和。当n逐渐增大时,T(n)的极限情况,一般简称为时间复杂度。
二、时间复杂度的计算样例
T(n)=3n^2+5n+2
首先 忽略常数项。
接着 忽略系数。
最后 只保留最高项。
得到时间复杂度为O(n^2)。
三、时间复杂度的大小比较
O(1)<O(log2 n)<O(n)<O(nlog2n)<O(n^2)<O(n^3)<O(2^n)
四、时间复杂度的具体理解
洛谷p2249
首先分析:
数据保证,1<=n<=10^6,0<=q<=10^9,1<=m<=10^6
如果采用暴力查找则数量级为10^5*10^6=10^11>10^9,因此必然会超过1秒运行时间,会出现TLE
因此采用二分查找,二分查找数量级为log2n,因为处理m个询问O(m)=10^6
log2 10^6=20,因此O(mlogn)=2*10^6<10*9就不会超时
#include<bits/stdc++.h>
using namespace std;
const int N=1000010;
int a[N];
int main(){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
while(m--){
int x;
cin>>x;
int low=1;
int high=n;
while(high>low){
int mid=(high+low)/2;
if(a[mid]>=x){
high=mid;
}
else{
low=mid+1;
}
}
if(a[low]==x){
cout<<low<<" ";
}
else{
cout<<-1<<" ";
}
}
return 0;
}
2.空间复杂度
一、空间复杂度概念
一个算法的空间复 杂度是指程序运行开始到结束所需要的存储空间。包括算法本身所占用的存储空间、输入/输出数据占用的存储空间以及算法在运行过程中的工作单元和实现省法所需辅助空间类似于算法的时间复杂度,算法所需存储空间的量度记作:
S(n)= O(f(n))。
一般来说题目不会卡着。