我需要知道如何在以下程序中确定 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
我还想知道,一般来说,如何确定所有算法的频率计数,而不仅仅是这一算法。
答案 0 :(得分:3)
ΣΣΣ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
目前还没有计算运行时间的通用方法,如果有某种方法,应该从计算机科学中删除复杂性理论。
答案 1 :(得分:1)
对于表示确切频率的表达式,您需要咨询summation formulas for polynomials。
即,内循环依赖于外循环的当前迭代。例如:
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 = 1 n i。
答案 2 :(得分:1)
好吧,让我们从内到外构建它。
每次运行内部循环时,代码行执行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
次。
我会将最终结果作为练习留给读者。
虽然这个问题一般是不可判定的 - 如果你知道程序中每行代码会执行多少次,你就可以解决停机问题。