【发布时间】:2013-06-25 02:56:22
【问题描述】:
我有大约 200 个 (index , float) 类型的列表,我想计算它们之间的平均值,我知道 O(first Array size + ... + last Array size) 的复杂度时间的方式有没有任何解决方案来计算具有更好复杂度时间的平均值?
【问题讨论】:
我有大约 200 个 (index , float) 类型的列表,我想计算它们之间的平均值,我知道 O(first Array size + ... + last Array size) 的复杂度时间的方式有没有任何解决方案来计算具有更好复杂度时间的平均值?
【问题讨论】:
不可能计算时间复杂度小于O(n)的N个独立项目的平均值:因为您必须至少访问每个项目一次才能计算总数。
如果你想击败 O(n) 复杂度,那么你需要做一些特别的事情,例如:
当然,复杂性并不总是直接等同于速度。如果您想快速做到这一点,那么还有很多其他技术(例如使用并发或并行)。但就复杂性而言,它们仍然是 O(n)。
【讨论】:
您通过divide and conquer 接近它。为此,您可以使用ExecutorService
【讨论】:
根据您在列表/数组中的读取方式,您可以将浮点数加在一起,同时将它们读入内存。将值除以数组的大小很便宜。因此,您不需要两次处理这些值。
如果您使用 Collection 类来存储值,您可以扩展例如ArrayList 并重写 add() 方法以更新 sum 字段并提供 getMean() 方法。
【讨论】:
不,没有比在计算中包含每个元素(即O(first Array size + ... + last Array size))更好的方法了,至少对于上述问题来说不是。如果列表具有某些特殊属性,或者您想在添加、删除或更改元素或列表后重复重新计算平均值,那就另当别论了。
非正式证明:
假设您设法通过跳过一个元素来计算平均值。从逻辑上讲,您可以通过将跳过的元素更改为任何其他值来达到相同的平均值(因为我们跳过了它,所以它的值无关紧要)。但是,在这种情况下,平均值应该不同。因此,您必须使用计算中的每个元素。
【讨论】: