Edit:由于似乎没有人阅读此链接的原始问题,因此让我在这里介绍一下它的概要。
正如其他人所问的,最初的问题是,给定大量值,总和将超过数据类型的值Double
那么如何计算这些值的平均值呢?
有几个答案说要按集合计算,比如取50个和50个数字,计算这些集合内的平均值,然后最后取所有这些集合的平均值,然后将它们组合起来得到最终平均值。
我的立场是,除非你能保证所有这些值都可以分成多个大小相等的集合,你不能使用这种方法。有人鼓励我在这里问这个问题,以便提供答案,所以就在这里。
基本上,给定任意数量的值,其中:
- 我事先知道值的数量(但同样,如果你不知道,你的答案会如何改变?)
- 我无法收集所有数字,也无法对它们求和(对于您的编程语言中的正常数据类型来说,总和太大了)
我怎样才能计算平均值?
这里问题的其余部分概述了如何分割成相同大小的集合,以及该方法存在的问题,但我真的只是想知道如何做到这一点。
请注意,我对数学非常了解,知道用数学理论术语来说,计算A[1..N]/N
会给我平均值,让我们假设有一些原因导致它不那么简单,并且我需要分割工作负载,并且值的数量不一定能被 3, 7, 50 整除、 1000 或其他。
换句话说,我所追求的解决方案必须是通用的。
从这个问题来看:
- 当所有值的总和超过双精度限制时,计算平均值的好解决方案是什么? https://stackoverflow.com/questions/1930454/what-is-a-good-solution-for-calculating-an-average-where-the-sum-of-all-values-ex
我的立场是,将工作负载分成几组是不好的,除非您可以确保这些组的大小相等。
Edit:最初的问题是关于特定数据类型可以容纳的上限,并且由于他要对很多数字进行求和(示例中给出的计数是 10^9),因此该数据类型无法容纳总和。由于这是原始解决方案中的一个问题,我假设(这是我的问题的先决条件,很抱歉错过了)数字太大,无法给出任何有意义的答案。
因此,直接除以值的总数是不行的。正常的 SUM/COUNT 解决方案被淘汰的最初原因是 SUM 会溢出,但我们假设,对于这个问题 SET-SET/SET-SIZE 会下溢,或者其他什么。
重要的是我不能简单地求和,也不能简单地除以总值的数量。如果我做不到这一点,我的方法是否有效,我能做些什么来解决这个问题?
让我概述一下问题。
假设您要计算数字 1 到 6 的平均值,但您不能(无论出于何种原因)通过对数字求和、对数字进行计数,然后将总和除以计数来实现此目的。换句话说,你不能简单地做(1+2+3+4+5+6)/6。
换句话说,SUM(1..6)/COUNT(1..6)
出来了。我们在这里不考虑 NULL(如数据库中的 NULL)。
该问题的几个答案提到能够将要平均的数字分成几组,例如 3、50 或 1000 个数字,然后计算一些数字,最后将这些值组合起来以获得最终平均值。
我的立场是,这在一般情况下是不可能的,因为这将使一些数字,即出现在最终集中的数字,比之前集中的所有数字或多或少有价值,除非你可以将所有数字平均分成大小的集合。
例如,要计算 1-6 的平均值,您可以将其分成 3 个数字组,如下所示:
/ 1 2 3 \ / 4 5 6 \
| - + - + - | + | - + - + - |
\ 3 3 3 / \ 3 3 3 / <-- 3 because 3 numbers in the set
---------- -----------
2 2 <-- 2 because 2 equally sized groups
这给了你这个:
2 5
- + - = 3.5
2 2
(注意:(1+2+3+4+5+6)/6 = 3.5,所以这里是正确的)
然而,我的观点是,一旦无法将值的数量拆分为多个相同大小的集合,则此方法就会失效。例如,序列 1-7 怎么样,其中包含质数个值。
可以采用类似的方法,但不能求和all值和计数all这些价值观一次性有效吗?
那么,有这样的做法吗?如何计算满足以下条件的任意数量的值的平均值:
- 无论出于何种原因,我都无法采用正常的求和/计数方法
- 我事先知道值的数量(如果不知道怎么办,这会改变答案吗?)