我需要知道如何确定以下程序中sum:= sum+1语句的频率计数:
sum:=0
for i:=1 to n do
for j:=1 to i do
for k:=1 to j do
sum:= sum+1
end<br/>
end
end
我想了解如何确定所有算法的频率计数,而不仅仅是特定算法。
∑∑∑ 1 = ∑∑ j = ∑ (i*(i+1))/2 = ∑(i^2+i)/2 = (n(n+1)(2n+1)/6+n(n+1)/2)/2 = n(n+1)(n+2)/6
这是您的公式:
F(n) = n(n+1)(n+2)/6
目前并没有一种通用的方式来计算运行时间,如果有的话,复杂性理论应该被移除计算机科学。
对于表示精确频率的表达式,您需要参考多项式求和公式。
也就是说,内部循环取决于外部循环的当前迭代。例如:
sum := 0
for i:=1 to n do
for j:=1 to i do
sum := sum + 1
根据变量n
,总和为1+2+3+4+5+...+n。在求和表示法中,它为Σi=1ni。
好的,让我们从内到外构建它。
每次内部循环运行时,该行代码会执行j
次。 到目前为止一切顺利。
因此,每次运行中间循环时,我们会执行语句1 + 2 + 3 + ... + i-1 + i
i *(i + 1)/ 2
或(i ^ 2 + i)/ 2
。
对于每次我们运行外部循环,我们会执行语句((1 ^ 2 + 1) + (2 ^ 2 + 2) + ...(n ^ 2 + n))/ 2
次。
我将把最终结果留给读者作为练习。
尽管通常情况下这个问题是不可判定的 - 如果您知道程序中每行代码将执行多少次,则已经解决了停机问题。
sum
的值? - Anon.