例1. 分析以下算法的时间复杂度。
void f(int n)
{
int p=1,d=n,f=n;
while(d>0)
{
if(d%2==1) p=p*f;
f=f*f;d=d/2;
}
}
分析:算法中while循环的if条件包含的p=p*f
语句可以不考虑,因为它执行的次数不超过d=d/2
语句的执行次数。
基本运算是语句d=d/2
(或f=f*f
),设其执行时间为T(n)T(n)T(n),则有d=n/2T(n)>0≥1,2T(0)≤nd=n/2^{T(n)}>0\geq 1,2^{T(0)}\le nd=n/2T(n)>0≥1,2T(0)≤n,即T(n)≤logn=O(logn)T(n)\leq logn=O(logn)T(n)≤logn=O(logn)
例2.分析下列算法的时间复杂度
字符串逆置(顺序表逆置)
void Reverse(char* p)
{
int n = strlen(p);
for(int i=0;i<n/2;i++)
{
ch=p[i];
p[i]=p[n-i-1];
p[n-i-1]=ch;
}
}
基本语句为ch=p[i]
,频数为n/2,时间复杂度为O(n)O(n)O(n)。
例3.分析下列算法的时间复杂度
从二维整型数组a[m][n]
中查找出最大元素所在的行、列下标。
void Find(int a[M][N],int m,int n,int& Lin,int& Col)
{
/*
M和N为全局变量,且满足M>=m,N>=n
*/
Lin=0,Col=0;
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
if(a[i][j]>a[Lin][Col])
{
Lin=i;
Col=j;
}
}
}
}
时间复杂度为O(m×n)O(m\times n)O(m×n)。
例4.分析下列算法复杂度。
void func(int n)
{
int y=0;
while(y*y<=n)
{
y++;
}
}
时间复杂度为O(n12)O(n^{\frac1 2})O(n21)。