arrays - 从数组平均值计算数组元素平均差的有效方法

标签 arrays algorithm average

有没有办法通过只“访问”每个数组元素一次来计算数组元素与数组平均值的平均距离? (我搜索算法)

例子:

Array : [ 1 , 5 , 4 , 9 , 6 ]
Average : ( 1 + 5 + 4 + 9 + 6 ) / 5 = 5
Distance Array : [|1-5|, |5-5|, |4-5|, |9-5|, |6-5|] = [4 , 0 , 1 , 4 , 1 ]
Average Distance : ( 4 + 0 + 1 + 4 + 1 ) / 5 = 2

简单的算法需要 2 遍。

第 1 遍)读取并累加值,然后将结果除以数组长度以计算数组元素的平均值。

第 2 遍)读取值,累加每个值与先前计算的平均值的距离,然后将结果除以数组长度,以求出元素与数组平均值的平均距离。

这两个过程是相同的。它是计算一组值的平均值的经典算法。第一个将数组的元素作为输入,第二个将每个元素与数组平均值的距离作为输入。

计算平均值可以修改为不累加值,而是在我们从数组中顺序读取元素时“即时”计算平均值。

公式为:

Compute Running Average of Array's elements
-------------------------------------------
RA[i] = E[i] {for i == 1}
RA[i] = RA[i-1] - RA[i-1]/i + A[i]/i { for i > 1 }

其中 A[x] 是数组在位置 x 处的元素,RA[x] 是数组元素在位置 1 和 x 之间的平均值(移动平均值)。

我的问题是:

是否有类似的算法来计算“动态”(当我们读取数组元素时)元素与数组平均值的平均距离?

问题是,当我们读取数组的元素时,数组的最终平均值是未知的。只有运行平均值是已知的。因此计算与运行平均值的差异不会产生正确的结果。我想,如果存在这样的算法,它可能应该有“能力”以某种方式补偿每个新元素读取的到目前为止计算出的错误。

最佳答案

我不认为你能比 O(n log n) 做得更好。

假设数组已排序。那么我们可以把它分成小于平均值的元素和大于平均值的元素。 (如果某些元素等于平均值​​,那没关系。)假设前 k 个元素小于平均值。那么平均距离为

D = ((xave-x1) + (xave-x2) + (xave-x3) + ... + (xave-xk) + (x k+1-xave) + (xk+2-xave) + ... + (xn-xave))/n

= (-x1) + (-x2) + (-x3) + ... + (-x k) + (xk+1) + (xk+2) + ... + (xn) + (n-2k)xave)/n

= ( [高于平均值的元素总和] - [低于平均值的元素总和] + (n-2k)xave)/n

您可以通过从两端进行计算,同时调整(目前未知的)平均值的限制,一次性计算出这一点。 这将是 O(n),排序是 O(n logn)(它们可能在同一操作中完成),所以整个事情是 O(n logn)。

关于arrays - 从数组平均值计算数组元素平均差的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9561570/

相关文章:

属性名称中的 PHP 冒号

arrays - Julia 中抽象类型数组的使用

algorithm - 在 N-1 比较中,如何在最初为空的二项式队列中插入 N 个元素?

c# - 实现高斯朴素贝叶斯

JavaScript 数组 - 有效地计算给定时间间隔内的平均值

php - 将 MYSQL 结果放入 PHP 数组

Java - 在不知道字符编码的情况下将 byte[] 转换为 String

algorithm - 了解在数组中查找重复项背后的概念

sql - 在 Oracle SQL 中使用 AVG()

mysql - 每小时平均 time()