复杂度小于O(n)的平均算法

时间:2015-12-09 00:13:51

标签: algorithm time-complexity

是否有任何算法可以找到复杂度小于n的{​​{1}}值的平均值?

4 个答案:

答案 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)