PrefixAverages1(X)
Input: X, a 1-D numerical array of size n
1) Let A = an empty 1-D numerical array of size n
2) For i = 0 to n-1
3) Let s = X[0]
4) For j = 1 to i
5) Let s = s + X[j]
6) End For
7) Let A[i] = s /(i+1)
8) End For
Output: An n-element array A of numbers such that A[i]
is the average of elements X[0],X[1], … ,X[i]
PrefixAverages2(X)
Input: X, a 1-D numerical array of size n
1) Let A = an empty 1-D numerical array of size n
2) Let s = 0
3) For i = 0 to n-1
4) Let s = s + X[i]
5) Let A[i] = s / (i+1)
6) End For
Output: An n-element array A of numbers such that A[i]
is the average of elements X[0],X[1], … ,X[i]
所以这就是我目前所知道的:
第一个算法使用第二个嵌套for循环。 第二个更有效率。 在第一个中,S等于数组的第一个元素。在第二个中,S等于0.
我还缺少什么?任何帮助都将非常感谢,谢谢!
答案 0 :(得分:0)
在两种算法中,在每次迭代结束时,S等于从0到i
的所有元素的总和。
在第二个算法中,直到第一次迭代,还没有看到任何元素,使得总和为0.
在第一个中,计算S
的循环从1开始计数。因为它永远不会查看X[0]
,所以必须在其他位置添加,以使得总和正确。因此S
已经开始包括X[0]
。 (即使对于空列表,这也是安全的,因为在空列表中我们永远不会计算总和。)
如果您更改了第一个算法的求和循环,使其从0开始计数,那么S
将从0开始。我认为这不是那样做的,因为作者是微优化的,并且没有看到初始化为0的点,然后在他已经知道它的时候立即添加X[0]
。