例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
),设其执行时间为
,则有
,即
例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,时间复杂度为
。
例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;
}
}
}
}
时间复杂度为
。
例4.分析下列算法复杂度。
void func(int n)
{
int y=0;
while(y*y<=n)
{
y++;
}
}
时间复杂度为 。