算法所花费的时间与语句的执行次数成正比例,算法中的基本操作的执行次数,为算法的时间复杂度
1.计算方法
用常数1取代运行时间的所有加法常数
在运行次数函数中,只保留最高阶
如果最高阶存在且不是1,就去除与这个项目相乘的常数
2.题目
题目1:
int count =1;
while (count < n);
{
count = count * 2;
}
分析:
循环执行1次:count=1*2=2,
循环执行2次:count=2*2=2^2,
循环执行3次:count=2*2=2^3,
循环执行x次:count=2^x,
因为每次count乘以2之后,就离n更近了,有多少个2相乘后大于n,就会退出循环
2^x=n得到x=log2n,所以时间复杂度为O(logn)
题目2:
void aFunc(int n) {
for (int i = 0; i < n; i++) {
for (int j = i; j < n; j++) {
printf("Hello World\n");
}
}
}分析:
因为当 i = 0 时,内循环执行 n 次运算,当 i = 1 时,内循环执行 n - 1 次运算……当 i = n - 1 时,内循环执行 1 次运算。
所以总的执行次数为: n + (n - 1) + (n - 2)+.....+ 1 = n(n + 1) / 2 = n^2 / 2 + n / 2,然后 只保留最高阶项,再去除与这个项相乘的常数,也就是1/2,此时时间复杂度O(n^2)。
题目3:
int x=0,y=0;
for(int k = 0;k<n;k++)
{
x++;
}
for(int i=0;i<n;i++)
{
for(int j =0;j<n;j++)
{
y++;
}
}
分析:
第一条for循环语句是执行了n次,第二条for循环外循环执行了n次,嵌套内循环再次循 环n次,总的执行次数为:n+n*n,保留最高阶项,所以时间复杂度为O(n^2)
题目4:
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
a[i] [j]=0;
}
}
分析:
a[i][j]=0是基本语句,外循环执行n次,内循环执行m次,共执行了 mn次,所以时间复杂 度O(mn)
题目5:
int sum = 0, n = 100;
sum = (1+n) * n / 2;
printf("%d",sum);
分析:
每条语句都执行了1次,共执行3次,根据方法用常数1取代运行时间中的所有加法常数
所以时间复杂度为O(1)