循环算法的分析
类型一:
for(int i=0;i<m;i++){
for(int j=1;j<n;j++){
cout<<"abc"<<endl;
}
}
时间复杂度:O(m)*O(n)=O(mn)
类型二:
for(int i=0;i<m;i++){
for(int j=1;j<i;j++){
cout<<"abc"<<endl;
}
}
时间复杂度:1+2+....+m=O(m^2)
类型三:
for(int i=1;i<n;i*=2){
cout<<"abc"<<endl;
}
时间复杂度:(依靠运行次数建立等式关系)2^k=n k=O(logn)
类型四:
int i=1,j=1;
while(i<n){
j+=j;
j++;
}
时间复杂度:(依靠运行次数建立等式关系)1+2+...+k=n k=O()
类型五:
int i=1,j=1;
while(i<n&&j<n){
i*=2;
j+=2;
for(int k=0;k<10;k++){
cout<<"abc"<<endl;
}
}
时间复杂度:(依靠运行次数建立等式关系)2^k=n k=O(logn)
递归函数的时间复杂度分析:
先用该公式猜出答案,再用归纳法
例题一:
void test1(int n){
if(n>1){
cout<<"abc"<<endl;
test1(n/2);
}
}
T(n)=T(n/2)+O(1) 时间复杂度:O(logn)
例题二:
void test2(int n){
if(n>1){
for(int i=0;i<n;i++) cout<<"abc"<<endl;
test2(n/2);
}
}
T(n)=T(n/2)+O(n) 时间复杂度:O(n)
例题三:
void test3(int n){
if(n>1){
test3(n/2);
for(int i=0;i<n;i++) cout<<"abc"<<endl;
test3(n/2);
}
}
T(n)=2T(n/2)+O(n) 时间复杂度:O(nlogn)
例题四:
void test4(vector<int>&a,int t){
int l=0,r=a.size()-1;
while(l<=r){
int m=(l+r)/2;
if(a[m]==t)return m;
if(a[m]<t)r=m-1;
else l=m+1;
}
return -1;
}
这道题同样能写出递推式
T(n)=T(n/2)+O(1) 时间复杂度:O(logn)