Algorithm 如何高效地添加万亿个数字?

Algorithm 如何高效地添加万亿个数字?,algorithm,performance,optimization,data-structures,Algorithm,Performance,Optimization,Data Structures,假设每个数字的大小接近max int,但略有不同(允许相同的数字) 例:2147483646 例:2945283647 例如:2643483500 等等 我确信在这种情况下使用循环会失败,原因很简单,因为程序会因超时错误而中止。对于一个万亿数字的加法,无法进行万亿次操作,这需要一段时间。因为我们讨论的是4 TB,我们可能最多只讨论加载到SSD中的数字,CPU时间将远小于从SSD读取1万亿数字所需的时间 只要我们确保数据访问是并行的,就很容易并行地完成这项工作。让大量CPU从一个SSD读取一万

假设每个数字的大小接近max int,但略有不同(允许相同的数字)

  • 例:2147483646
  • 例:2945283647
  • 例如:2643483500
  • 等等

我确信在这种情况下使用循环会失败,原因很简单,因为程序会因超时错误而中止。

对于一个万亿数字的加法,无法进行万亿次操作,这需要一段时间。因为我们讨论的是4 TB,我们可能最多只讨论加载到SSD中的数字,CPU时间将远小于从SSD读取1万亿数字所需的时间

只要我们确保数据访问是并行的,就很容易并行地完成这项工作。让大量CPU从一个SSD读取一万亿个数字并不能加快速度


求和不适用于64位数字,但如果每个数字都在maxint的2^24范围内,则可以将maxint和每个数字之间的差值相加,这将适用于64位无符号整数。

对n个数字求和(固定字长)至少需要O(n),因为这里每个数字都很重要。你唯一能做的就是把事情并行化。然而,如果数据不是随机的,而是有一定的结构,我们有时可以利用它。这是一种实际需要还是你只是好奇?万亿个数字相当于大约4 TB的二进制数据。您需要先问问自己如何读取4 TB的数据。此外,如果每个数字接近2^32,它们的总和将溢出64位数据类型。此外,循环不会“超时”。超时是由程序员添加的。随机选取100万,将其相加,乘以1000000,然后将最后6位数字随机化。没有人会知道:)@AdrianMcCarthy万亿大约是2^40,因此如果万亿值的平均值是2^30,那么总和大约是2^70,这不适合64位类型。对于64位无符号整数类型,平均值必须小于2^24。