浅谈时间复杂度

每一题都有一个时间限制,一般是1秒,也就是大约 1 \times 10^7 次。
时间复杂度有这样几种:


O(1) :无循环算法类,数据限制 无

比如
#include<iostream>
using namespace std;
int main(){
	cout<<"Hello,World!";
	return 0;
}

O(log_2(n)) :二分算法等,数据限制 n \leq 2^{1 \times 10^7}

比如
#include<iostream>
using namespace std;
int n,a[15],t,l,r,mid;
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	cin>>t;
	l=1;
	r=n;
	while(l<=r){
		mid=l+(r-l)/2;
		if(a[mid]<t){
	        l=mid+1;
	    }
		else{
	        r=mid-1;
	    }
	}
	cout<<l;
    return 0;
}


O(n) :单层for循环算法等,数据限制 n \leq 1 \times 10^7

比如
#include<iostream>
using namespace std;
int n;
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cout<<i<<" ";
	}
	return 0;
}

O(nlog_2(n)) :快排等,数据限制 n \leq 1.3 \times 10^6

比如
#include<iostream>
#include<algorithm>
using namespace std;
int n,a[15];
int findpos(int l,int h){
    int p=a[h];
    int ii=l-1;
    for(int i=l;i<h;i++){
        if(a[i]<=p){
            ii++;
            swap(a[ii],a[i]);
        }
    }
    swap(a[ii+1],a[h]);
    return ii+1;
}
void qs(int l,int h){
    if(l<h){
        int pos=findpos(l,h);
        qs(l,pos-1);
        qs(pos+1,h);
    }
}
int main() {
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
    qs(0,n);
	for(int i=1;i<=n;i++){
		cout<<a[i]<<" ";
	}
    return 0;
}

O(n^2) :双层for循环算法等,数据限制 n \leq 3000

比如
#include<iostream>
using namespace std;
int n;
int main() {
	cin>>n;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			printf("%5d",(i-1)*n+j);
		}
		cout<<"\n";
	}
    return 0;
}

O(2^n) :某些递归算法等,数据限制 n \leq 23

比如
#include<iostream>
using namespace std;
int n;
int f(int n){
	if(n==0){
		return 1;
	}
	return f(n-1)+f(n-1);
}
int main() {
	cin>>n;
	cout<<f(n);
    return 0;
}


O(n!) :常见递归阶乘算法,数据限制 n \leq 10

比如
#include<iostream>
using namespace std;
int n;
int f(int n){
	if(n==0||n==1){
		return 1;
	}
	return n*f(n-1);
}
int main() {
	cin>>n;
	cout<<f(n);
    return 0;
}

因此有
O(1) \lt O(log_2(n)) \lt O(n) \lt O(nlog_2(n)) \lt O(n^2) \lt O(2^n) \lt O(n!)
所以大家做题的时候一定要深思熟虑时间复杂度哦!


这么辛苦(最近搞元调,学业有点重,写了好几天)的份上,点个赞吧

4 个赞

已点赞

image

《已点赞》

不对这样会时间超限

大约是 1 \times 10^7

排序只需要用sort(a,a+n,cmp);(a是数组)
想从大都小排就
bool cmp(int a,int b){
return a>b;(小于就return a<b)
}

还有stable_sort();和sort的用法一样
(sort是快排,stable_sort是归并排序)

输出会时间超限

这段代码的时间复杂度为 O(n)O(n!) 常见于全排列算法,例:洛谷P1706

#include<iostream>
using namespace std;
int n,a[15];
bool b[15];
void dfs(int x){
	if(x>n){
		for(int i=1;i<=n;i++) printf("%5lld",a[i]);
		printf("\n");
		return ;
	}
	for(int i=1;i<=n;i++){
		if(!b[i]){
			b[i]=1,a[x]=i;
			dfs(x+1);
			b[i]=0;
		}
	}
}
int main(){
	cin>>n;
	dfs(1);
	return 0;
}