练习:分析时间复杂度

例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)>01,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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值