[英]Average algorithm with complexity less than O(n)
是否有任何算法可以找到復雜度小於O(n)
的n
值的平均值?
在我看來,您實際上想要一種可以根據新數據計算平均值而無需查看舊數據的算法。 換句話說,您真正想要的是一個不是O(n ^ 2)的在線算法。
您可以很輕松地擁有它。 也有用於方差和標准差的在線算法。 均值的基本公式非常簡單:
new_mean = old_mean + (next_val - old_mean) / n
這也很容易得出。 假設A_n
是n個項目的數組,而A_(n-1)
是沒有最后一個元素( a_n
)的相同數組。 我們想知道x
的值,使得mean(A_(n-1)) + x = mean(A_n)
。
x == mean(A_n) - mean(A_(n-1))
到目前為止,一切都很好,但這似乎要求我們知道我們所尋求的價值,即mean(A_n)
。 幸運的是,我們僅使用現有信息就可以發現這一點。 我們知道mean(A_n) = sum(A_n) / n
,並且不需要多考慮一下sum(A_n) = mean(A_(n-1)) * (n - 1) + a_n
x = sum(A_n) / n - mean(A_(n-1))
x = (mean(A_(n-1)) * (n - 1) + a_n) / n - mean(A_(n-1))
現在將x
的原始值替換為:
mean(A_n) - mean(A_(n-1)) =
(mean(A_(n-1)) * (n - 1) + a_n) / n - mean(A_(n-1))
- mean(A_(n-1))
項抵消:
mean(A_n) = (mean(A_(n-1)) * (n - 1) + a_n) / n
剩下的就是重新分配術語:
mean(A_n) = (n * mean(A_(n-1)) - mean(A_(n-1)) + a_n) / n
mean(A_n) = mean(A_(n-1)) - mean(A_(n-1)) / n + a_n / n
mean(A_n) = mean(A_(n-1)) + a_n / n - mean(A_(n-1)) / n
mean(A_n) = mean(A_(n-1)) + (a_n - mean(A_(n-1))) / n
new_mean = old_mean + (next_val - old_mean) / n
是的,如果您只需要一個近似值,只需對一部分數字進行采樣並取平均值即可。
如果可以假設數字的分布(例如高斯分布),則還可以計算需要采樣的數量,以得出在給定精度范圍內正確值范圍內的平均值。
不,如果不知道有關數字的任何元信息,這是不可能的。 原因是您必須至少讀取所有數字並且讀取n
數字為O(n)
除非您有其他信息,否則不可以。
例如。 如果您已經將物品分為k個倉位B 1 ... B k,倉位值為V 1 ... V k,則平均值約為M = sum(i = 1..k)[ B i ** * V ** i] / n。 這是O(1)。
交替。 如果您已經知道前n-1個項目的平均值為M old,那么添加第n個項目的平均值為V n時的平均值為M =( M old *(n-1)+ V n)/ 。 這也是O(1)。
或者,如果項目已經排序並且只能采用一些k個不同的值V 1 .. V k,(例如-數組{ V 1, V 1, V 1 .. V 1, V 2, V 2 .. V 2, V 3 .. V 3 ... V k, V k},則可以使用二進制搜索來找到每個值為V k的項目數,然后按照上面的合並示例計算平均值我認為這是O(k * ln(n))。
可能還有其他可能性...
但是,如果您僅具有n個值V 1 .. V n的列表或數組,我認為沒有什么比標准方法M = sum(i = 1..n)[ V i] / n更好的了。 哪個是O(n)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.