这是第一个算法。它没有任何正确的语法:
for(i=1;i<=n;i++)
{for(j=1;j<=i;j++)
for(k=1;k<=100;k++)
{printf("hello")
}
}
}
在这种情况下,我们通过查看printf语句执行的总次数来计算时间复杂度为O(n ^ 2)。因此,我们将为每个i从1到n添加k循环的次数。
第二段代码:
{int n=(2)^(2)^k //read as 2 to the power 2 to the power k
for (i=1;i<=n;i++)
{j=2
while(j<=n)
{j=j^2
printf("hello")
}
}
}
这里我们得到时间复杂度为O(n(loglogn))。我们看到第n个循环将执行n(k + 1)次。我们用k的值代替了时间复杂度。
我不明白为什么我们没有添加print语句执行的总次数来计算第二个代码中的时间复杂度,就像我们在第一个代码中所做的那样。我们只看到它在第n个循环中运行了多少次来计算答案。
答案 0 :(得分:1)
您需要清除基础知识。第一个循环的时间复杂度是 O(N ^ 2),它与printf
语句完全无关。它关于你最内层循环的迭代总数。
code 1
中最内层的循环运行100*(N^2)
O(N ^ 2),即使您的代码1为:
for(i=1;i<=n;i++)
{for(j=1;j<=i;j++)
for(k=1;k<=100;k++)
{
}
}
}
因此,只要您的最内层循环没有语句或语句需要 O(1)时间,答案就会保持不变。
对于你的第二个代码:while循环总是运行log(logn)
次,外循环总是运行n
次,因此时间复杂度 O(nlog(logn)),因为这是最里面(while)循环的迭代总数。