1. 程式人生 > >練習:分析時間複雜度

練習:分析時間複雜度

例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})