对此步数问题有疑问。我认为我有基本的想法,但努力将数学直接写在纸上。首先是伪代码:
for i = 1 to n
x = x + 1
j = n
while (j>1)
j = j/2
和我的解释:
n / 2 + 1
N / 2
N / 2
n / 2< - 第4行(while循环)的总和的顶部
Σlogn+ 2
i = 1< - 第4行的总和的底部(while循环)
n / 2< - 第5行的总和的顶部(while循环的主体)
Σlogn+ 1
i = 1< - 第5行的总和的底部(while循环的主体)
所以步数中的前三行也不错,但是循环中的两个求和对我来说有点棘手。因此,对于第一个登录+ 2,我可以分为两个步骤:
N / 2
Σ2
I = 1
和
N / 2
Σlogn
I = 1
所以我习惯于处理n的直接求和,而不是n / 2。但是我会给它一个快速的镜头。
2 *((n ^ 2 + n)/ 2)或者更确切地说只是丢弃这一部分,所以它是直的:n ^ 2 + n。
然后登录:
logn *((n ^ 2 + n)/ 2)=?现在我不太确定。不确定这甚至简化了。如果有人对此有任何建议我会很感激,但我想我得到的是这一半。因此,我将两者结合起来得到伪代码的第一个求和行4的最终答案:
logn *(n ^ 2 + n)/ 2 + n ^ 2 + n
对于第二次总结,我认为那将是:
logn * n ^ 2 + n
(可以从我上面已经完成的内容中借一点。刚刚放下我有2 *(n ^ 2 + n)/ 2的部分而不是我只需要两组半合并来制作一个n ^ 2 + n,如果这有任何意义我认为?
如果我完全失去了它,请告诉我。谢谢!!
答案 0 :(得分:0)
我认为你的分析有点过时了。首先,请注意for
循环体内发生的事情与i
或x
的值无关。因此for
循环执行n
次,并且每次在for
循环体中执行相同数量的步骤。 while
循环的主体执行floor(log 2 (n))次。这就是所有需要的分析。结果是n * floor(log 2 (n))。 (如果通过“步骤”表示语句执行,则需要对其进行一些修改以考虑每个循环体中的语句数。)