我是Algorithms和DS的新手。我指的是一本书,它有一些问题,我很难理解。
我需要找到以下程序的运行时间:(评论仅来自书本)
function(int n) {
for(int i=1;i<=n/3;i++) { // will execute n/3 time
for(int j=1;j<=n;j+=4) { // will execute n/4 times
printf("*");
}
}
}
答案:O(n ^ 2)
怎么样n ^ 2?第一个循环将执行n / 3次,第二个循环执行n / 4。 n / 3 * n / 4 = n ^ 2/12。怎么样n ^ 2?请帮我理解。
问题2
function(int n) {
for(int i=0;i<n;i++) { // will execute n times
for(int j=i;j<i*i;j+=4) { // will execute n*n times ?????? (How?)
if(j%i==0) {
for(int k=0;k<j;k++) { // will execute j times
printf("*");
}
}
}
}
}
答案:O(n ^ 5)
第一个循环执行n次。细
第二个循环如何执行n * n次?这里,j的值初始化为i,所以不应该是(n * n)-i次?如果j被初始化为0,那么它将是n * n次,对吗?
第三个循环执行j次因为k
请帮助我理解为什么第二个循环(j)将执行n * n次。谢谢。
答案 0 :(得分:0)
这本书涉及大哦。对大哦的完整介绍太长了,但是在大地方它坚持:
O(a*f(n)) = O(f(n))
a
常量。
另一个是:
O(a_k * n^k+ a_(k-1) n^(k-1)+...+a_0) = O(n^k)
f(n)
随机函数。
关于第二个问题:第二个循环从i
运行到i*i
。现在,由于i
将达到n-1
,因此其大小为O(n)
,因此循环将在上次运行(n-1)*(n-1)
次时执行。由于j
最终会达到某个订单O(n^2)
而第三个循环从0
运行到j-1
,因此第三个(最内部)循环的时间复杂度为{{ 1}}。因此,这意味着循环的总时间复杂度为:
O(n^2)