练习:分析时间复杂度

例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) ,则有 d = n / 2 T ( n ) > 0 1 , 2 T ( 0 ) n d=n/2^{T(n)}>0\geq 1,2^{T(0)}\le n ,即 T ( n ) l o g n = O ( l o g n ) T(n)\leq 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)
例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)
例4.分析下列算法复杂度。

void func(int n)
{
	int y=0;
	while(y*y<=n)
	{
		y++;
	}
}

时间复杂度为 O ( n 1 2 ) O(n^{\frac1 2})

猜你喜欢

转载自blog.csdn.net/weixin_36049506/article/details/85873180