时间复杂度概念
shufeng2012 · · 算法·理论
概念
==时间复杂度是程序中通用的程序运算时间表示方式==(又称大O表示法)。主要形式为O(表达式)。如O(n)。参数有n。时间复杂度是个抽象的概念。
常见的时间复杂度
常数阶
表示方式为
#include <iostream>
using namespace std;
int main()
{
cout<<"Hello, World!"<<endl; // 此处时间复杂度为O(1)
return 0;
}
注意:表示时要将所有系数转化为1或省略
例如:
#include<bits/stdc++.h>
using namespace std;
int main(){
cout<<"Hello, ";
cout<<"World!"<<endl; // 此处时间复杂度依然为O(1),O(2)经过化简系数后为O(1)
return 0;
}
对数阶
表示方式为
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;cin>>n;
int a[n];for(int i=0;i<n;i++)cin>>a[i];
int key;cin>>key;
int left=0,right=n-1;
while(left<=right){ // 此处时间复杂度为O(log_2 n)
int mid=left+(right-left)/2;
int(a[mid]==key){
cout<<mid<<endl;
return 0;
}else if(a[mid]<key)left=mid+1;
else right=mid-1;
}
cout<<-1<<endl;
return 0;
线性阶
表示方式为
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;cin>>n;
int a[n];for(int i=0;i<n;i++)cin>>a[i]; // 此处也为O(n)
for(int i=0;i<n;i++)cout<<a[i]<<" "; // 此处为O(n)
return 0;
}
线性对数阶
表示方式为
#include<bits/stdc++.h>
using namespace std;
void mergesort(vector<int>& a){ // 函数中的时间复杂度为O(n log_2 n)
if(a.size()>1){
int mid=a.size()/2
vector<int> left,right;
for(int i=0;i<=mid;i++)left[i]=a[i];
for(int i=0;i<=mid;i++)right[i]=a[mid+i];
mergesort(left);
mergesort(right);
int i=0,j=0,k=0;
while(i<left.size()&&j<right.size()){
if(left[i]<right[j])a[k++]=left[i++];
else a[k++]=right[j++];
}while(i<left.size())a[k++]=left[i++];
while(j<right.size())a[k++]=right[j++];
}
}
int main(){
int n;cin>>n;
vector<int> a(n);for(int i=0;i<n;i++)cin>>a[i];
mergesort(a);
for(int i=0;i<a.size();i++)cout<<a[i]<<" ";
return 0;
}
二次阶
表示方式为
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,m;cin>>n>>m;
int a[n][m];
for(int i=0;i<n;i++)for(int j=0;j<m;j++)cin>>a[i][j]; // 此处为O(n^2)
for(int i=0;i<n;i++)for(int j=0;j<m;j++)cout<<a[i][j]<<" "; // 此处也为O(n^2)
return 0;
}
三次阶
表示方式为
#include<bits/stdc++.h>
using namespace std;
int main(){
int m,n,o;cin>>m>>n>>o;
int a[m][n][o];
for(int i=0;i<m;i++)for(int j=0;j<n;j++)for(int k=0;k<o;k++)cin>>a[i][j][k]; // 此处为O(n^3)
for(int i=0;i<m;i++)for(int j=0;j<n;j++)for(int k=0;k<o;k++)cout<<a[i][j][k]<<" "; // 此处也为O(n^3)
return 0;
}
指数阶
表示方式为
#include<bits/stdc++.h>
using namespace std;
int fibonacci(int n){ // 函数体内为O(2^n)
if(n<=1)return n;
return fibonacci(n-1)+fibonacci(n-2);
}
int main(){
int n;cin>>n;
cout<<fibonacci(n)<<endl;
return 0;
}
感谢您的观看!!