2012-10-28 113 views
0
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] 

所以這是我目前所知:兩個Psuedo代碼之間的區別?

第一算法利用第二嵌套的循環。 第二個是更高效。 首先,S等於數組的第一個元素。在第二個中,S等於0.

我還缺少什麼?任何幫助將非常感激,謝謝!

+0

我不明白你在問什麼。你爲什麼覺得自己錯過了什麼? –

+1

其中一人重新計算每個平均值的總和。另一個積累總和並存儲平均值。這就是爲什麼2號更有效。 – nhahtdh

+1

你想了解什麼? – AnandVeeramani

回答

0

在兩種算法中,在每次迭代結束時,S等於從0到i的所有元素的總和。

在第二算法,直到第一次迭代中,沒有元素已經見過的,使之和0

在第一,計算S開始從1計數因爲它從來沒有看X[0]循環,必須在其他地方添加這筆款項才能找到正確的結果。所以S開始已經包括X[0]。 (這是安全的,即使空列表,因爲在一個空的列表中,我們從來沒有計算總和反正。)

如果更改了第一個算法的總結循環,使其開始從0開始計數,然後S會從0開始。我認爲這樣做並不是那麼完成的,因爲作者是微觀優化的,並沒有看到初始化爲0的點,然後當他已經知道它在那裏時立即添加X[0]