我不是故意要求简单的帮助,但我似乎无法弄清楚如何回答这个问题。
Compute the time complexity of the following program
fragment:
sum = 0;
for i=1 to n do
for j=1 to i do
k = n*2
while k>0 do
sum=sum+1;
k = k div 2;
我认识到while循环中的内容需要O(1),while循环需要O(logn),但是我不遵循连接到嵌套for循环的方式,因为我习惯于做用于for循环的嵌套sigma符号。
谢谢!
答案 0 :(得分:1)
以下是打破此功能复杂性的一些提示:
查看内部循环,其中k=n*2
。让我们假设n=8
所以k=16
,k
一直被除以2,直到它为0或更小(我假设舍入0.5得到0)。因此,直到循环结束时描述k
的系列将是16,8,4,2,1,0
。如果您知道第一个值是k
,请尝试考虑哪个函数描述了本系列中的元素数量。
你有两个嵌套for循环,第一个循环只迭代n
次,然后第二个(内部)循环迭代,直到它达到第一个循环的迭代次数(由{{1表示) }}),这意味着首先它将迭代一次,然后两次,依此类推,直到i
。因此,第二个循环执行的迭代次数可以由系列描述:n
。这是一个非常简单的arithmetic progression,这个系列的总和将为您提供内部for循环的迭代总数。这也是你调用内部while循环的次数(它不受当前迭代次数的影响,因为1, 2, 3, ... , n
取决于k
,它是常量而不是n
或i
)。
答案 1 :(得分:1)
正式演示,逐步显示算法增长的顺序: