【问题标题】:What is fastest method for mean more than two arrays of floats?平均两个以上浮点数组的最快方法是什么?
【发布时间】:2013-06-25 02:56:22
【问题描述】:

我有大约 200 个 (index , float) 类型的列表,我想计算它们之间的平均值,我知道 O(first Array size + ... + last Array size) 的复杂度时间的方式有没有任何解决方案来计算具有更好复杂度时间的平均值?

【问题讨论】:

    标签: java list mean


    【解决方案1】:

    不可能计算时间复杂度小于O(n)的N个独立项目的平均值:因为您必须至少访问每个项目一次才能计算总数。

    如果你想击败 O(n) 复杂度,那么你需要做一些特别的事情,例如:

    • 对子列表使用预先计算的总和
    • 利用数据中的已知依赖性(例如某些元素相等)

    当然,复杂性并不总是直接等同于速度。如果您想快速做到这一点,那么还有很多其他技术(例如使用并发或并行)。但就复杂性而言,它们仍然是 O(n)。

    【讨论】:

      【解决方案2】:

      您通过divide and conquer 接近它。为此,您可以使用ExecutorService

      【讨论】:

      • 分治比一起计算更好吗?
      • 绝对......谷歌合并排序你会得到更多
      • 我知道合并排序是什么,但是如果我想合并三个数组,是合并两个然后将结果与第三个合并更好还是一次合并三个更好?
      【解决方案3】:

      根据您在列表/数组中的读取方式,您可以将浮点数加在一起,同时将它们读入内存。将值除以数组的大小很便宜。因此,您不需要两次处理这些值。

      如果您使用 Collection 类来存储值,您可以扩展例如ArrayList 并重写 add() 方法以更新 sum 字段并提供 getMean() 方法。

      【讨论】:

        【解决方案4】:

        不,没有比在计算中包含每个元素(即O(first Array size + ... + last Array size))更好的方法了,至少对于上述问题来说不是。如果列表具有某些特殊属性,或者您想在添加、删除或更改元素或列表后重复重新计算平均值,那就另当别论了。

        非正式证明:

        假设您设法通过跳过一个元素来计算平均值。从逻辑上讲,您可以通过将跳过的元素更改为任何其他值来达到相同的平均值(因为我们跳过了它,所以它的值无关紧要)。但是,在这种情况下,平均值应该不同。因此,您必须使用计算中的每个元素。

        【讨论】:

        • 您说:“如果列表具有某些特殊属性,或者您想在添加、删除或更改元素或列表后反复重新计算平均值,那就另当别论了。”我改变了我的问题并解释了更多,你现在的想法是什么?
        猜你喜欢
        • 1970-01-01
        • 2021-08-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-08
        • 2011-05-08
        • 2010-09-17
        • 1970-01-01
        相关资源
        最近更新 更多