如何降低时间复杂度

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int a[10101],b[101010],h=0;
void sb(int n,int m)
{
if(n>=0&&m>=0)
{
if(n>=m)
{
h++;
sb(n-m,m);
}
else
{
h++;
sb(n,m-n);
}
}
else
{
if(h%2==0)
{
cout<<"lose";
}
else
{
cout<<"win";
}
}
}
int main()
{
int i=0;
while(cin>>a[i]>>b[i])
{
if(a[i]!=0)
{
i++;
}
else
{
break;
}
}
for(int j=1;j<=i;j++)
{
if(a[j]>=b[j])
{
if(a[j]/b[j]>=2)
{
cout<<"win";
}
else
{
sb(a[j],b[j]);
}
}
else
{
if(b[j]/a[j]>=2)
{
cout<<"win";
}
else
{
sb(a[j],b[j]);
}
}
}
return 0;
}

计算方法 1. 一般情况下,算法的基本操作重复执行的次数是模块n的某一个函数f(n),因此,算法的时间复杂度记做:T(n)=O(f(n)) 分析:随着模块n的增大,算法执行的时间的增长率和 f(n) 的增长率成正比,所以 f(n) 越小,算法的时间复杂度越低,算法的效率越高。 2. 在计算时间复杂度的时候,先找出算法的基本操作,然后根据相应的各语句确定它的执行次数,再找出 T(n) 的同数量级(它的同数量级有以下:1,log(2)n,n,n log(2)n ,n的平方,n的三次方,2的n次方,n!),找出后,f(n) = 该数量级,若 T(n)/f(n) 求极限可得到一常数c,则时间复杂度T(n) = O(f(n)) 例:算法: 1 2 3 4 5 6 7 8 9 for(i=1;i<=n;++i) { for(j=1;j<=n;++j) { c[i][j]=0;//该步骤属于基本操作执行次数:n的平方次 for(k=1;k<=n;++k) c[i][j]+=a[i][k]*b[k][j];//该步骤属于基本操作执行次数:n的三次方次 } } 则有 T(n) = n 的平方+n的三次方,根据上面括号里的同数量级,我们可以确定 n的三次方 为T(n)的同数量级 则有 f(n) = n的三次方,然后根据 T(n)/f(n) 求极限可得到常数c 则该算法的时间复杂度:T(n) = O(n^3) 注:n^3即是n的3次方。 3.在pascal中比较容易理解,容易计算的方法是:看看有几重for循环,只有一重则时间复杂度为O(n),二重则为O(n^2),依此类推,如果有二分则为O(logn),二分例如快速幂、二分查找,如果一个for循环套一个二分,那么时间复杂度则为O(nlogn)。
温馨提示:内容为网友见解,仅供参考
无其他回答
相似回答
大家正在搜