練習:分析時間複雜度
阿新 • • 發佈:2019-01-07
例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++;
}
}
時間複雜度為 。