查找大型数字列表的平均值

时间:2014-02-10 14:17:22

标签: algorithm

遇到了这个采访问题。

  

编写算法以查找大型列表的平均值(平均值)。这个   列表可能包含数万亿或数十亿的数字。每个号码都是   可管理的数百,数千或数百万。

谷歌搜索它给了我所有的Median of Medians解决方案。我该如何处理这个问题呢? 分而治之足以应付数万亿的数字? 如何处理如此大的列表?

2 个答案:

答案 0 :(得分:1)

如果列表的大小是可计算的,那实际上只是你可以使用多少内存,应该花多长时间以及算法应该是多么简单。
基本上,您可以添加所有内容并按大小划分 如果你没有足够的内存,先划分可能会有效(注意你可能会失去一些精确度)。

另一种方法是递归地将列表分成两半并计算子列表的平均值。递归终止条件是列表大小为1,在这种情况下,均值只是列表中唯一的元素。如果您遇到奇数大小的列表,请将第一个或第二个子列表设置得更长,这几乎是任意的,甚至不必保持一致。

但是,如果您列出的是巨大的,无法计算其大小,则无法将其拆分为2个子列表。在这种情况下,递归方法几乎可以起作用。您可以使用2个元素(或者更确切地说,立即计算它们的平均值)拆分为n/2列表,而不是使用n/2元素拆分为2个列表。所以基本上,你计算元素1和2的平均值,这将成为你的新元素1. 3和4的平均值是你的新第二个元素,依此类推。然后将相同的算法应用于新列表,直到只剩下1个元素。如果遇到奇数大小的列表,请在末尾添加元素或忽略最后一个元素。如果你添加一个,你应该尽量接近你的预期平均值 虽然这不会在数学上精确计算平均值,但对于那个大小的列表,它将足够接近。这几乎是mean of means方法。您也可以使用median of medians路线,在这种情况下,您可以递归地选择子列表的中位数。同样的原则适用,但您通常希望得到一个奇数 如果您的列表具有偶数大小,您甚至可以组合这些方法并计算均值,如果它是奇数大小,则可以计算中位数。在许多递归步骤中执行此操作将生成非常准确的结果。

答案 1 :(得分:1)

首先,这是一个面试问题。所述问题在实践中不会出现。此外,这里陈述的问题是不精确的。这可能是故意的。 (他们想看看你如何解决一个不精确指定的问题。)

  

编写算法以查找大型列表的平均值(平均值)。

  • “发现”这个词很有弹性。它可能意味着计算(达到某种精度)或者它可能意味着估计。

  • 短语“大名单”是橡皮的。如果可能意味着内存中的列表或数组数据结构,或者“list”可能是数据库查询的结果,则是一个或多个文件的内容。

  • 没有提及将要实现此功能的系统的硬件限制。

所以第一件事>> I<<会做的是尝试通过询问面试官的一些问题来缩小范围。

但假设你做不到,那么完整的答案需要涵盖以下几点:

  • 数据集可能不会同时适合内存。 (但如果确实如此,那就很好。)

  • 如果您按顺序执行此计算,N数字的平均值为O(N)。对于N这个尺寸,它可能是一个棘手的问题。

  • 另一种方法是拆分为等于大小的子列表,并计算平均值和平均值的平均值。理论上,这为您提供O(N/P),其中P是分区数。并行性可以用多个线程实现,在同一台机器上有多个进程,或者是分布式的。

  • 实际上,限制因素将是计算,内存和/或I / O带宽。如果您能解决这些限制,并行解决方案将会有效。例如,您需要平衡每个“工作人员”对其“子列表”具有无法访问权限的问题与制作数据副本的问题之间的平衡问题。

  • 如果列表以允许采样的方式表示,那么您可以在不查看整个数据集的情况下估算平均值。事实上,这可能是O(C),具体取决于您的采样方式。但是你的样本可能没有代表性,而且平均值太不准确了。

  • 在进行计算的所有情况下,您需要防止(整数)溢出和(浮点)舍入错误。特别是在计算总和时。

  • 讨论如何使用“大数据”平台(例如Hadoop)解决这个问题以及该方法的局限性(例如加载数据所需的时间......)是值得的。