是否有任何算法可以找到复杂度小于n
的{{1}}值的平均值?
答案 0 :(得分:5)
听起来我真的想要一种能够根据 new 数据计算平均值的算法,而无需查看旧数据。换句话说,你真正想要的是一个不是O(n ^ 2)的在线算法。
你可以很容易地拥有它。 variance and standard deviation也有在线算法。手段的基本公式很简单:
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
答案 1 :(得分:3)
是的,如果您只需要近似值,只需对数字的子集进行采样并对其进行平均。
如果您可以假设数字的分布(例如高斯分布),您还可以计算需要采样的数量,以获得正确值内的平均值到给定的精度。< / p>
答案 2 :(得分:1)
不,如果不了解有关数字的任何元信息,这是不可能的。这样做的原因是您必须至少阅读所有数字并且n
数字为O(n)
答案 3 :(得分:1)
。
例如。如果已经将项目分为k个区域 B 1 ... B k,则bin值 V 1 ... V k然后平均值将近似 M = sum(i = 1..k)[ B i *** V ** I] / N。这是O(1)。
可替换地。如果已经知道前n-1项的平均值 M 旧,那么添加第n项的平均值为 V < / strong> n M =( M 旧*(n-1)+ V n)/ 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 <的项目数/ strong> k,然后计算上面的分箱示例中的平均值。我认为这是O(k * ln(n))。
可能还有其他可能性......
但如果你只有一个列表或数组的n值 V 1 .. V n,我不相信有什么比标准更好方法 M = sum(i = 1..n)[ V i] / n。哪个是O(n)