【发布时间】:2015-10-17 23:53:36
【问题描述】:
我想获取区间[min, max]中的所有素数。我想在n 服务器中进行微积分。将我的初始间隔划分为另一个 n 间隔以管理所有 n 服务器中大致相同的负载的最佳方法是什么?
[可选]
我有一个想法,但它没有按我的预期工作。我假设所有数字都是素数,所以一个数字 i 花费 i 指令来验证是一个素数。
如果我们记住这个方法:
那么,在区间 [1,100] 中获取素数的指令数为1+2+..+99+100 = 100(1+100)/2 = 5050。
现在,如果我想在 2 台服务器 (n=2) 中执行此计算,我必须将此负载分配给每台服务器(每台 2525 条指令)。我想要的区间由2525 = x(1+x)/2 -> x=71定义。
一般来说,一般公式为Load = (Interval(x) - Interval(x-1) + 1) * (Interval(x-1) + Interval(x)) / 2,即Load = (max - min + 1) * (min + max) / (2 * n)。
这样做,使用x and y = [1:9999999] 和n = 16,我得到了这个结果:
(来源:subirimagenes.com)
我没有在所有服务器中获得相同的时间和指令,这意味着这不是划分间隔的方式。
有什么想法吗?
【问题讨论】:
-
这不是比编程问题更多的数学问题吗?
-
是的。仍然是知识和好奇心:D
-
除此之外,这纯粹是数学问题(并且可能有更好的网站可以提出此类问题)......我有一些直觉认为你的基本假设不起作用:你不能假设素数是平均分配。与较小的喜欢相比,较大的数字不太可能是素数。因此,当您创建相同大小的区间时,它们将包含(显着?!)不同数量的素数。
-
math.stackexchange.com 可以解决这类问题 :) 还有一些不错的算法,比如 en.wikipedia.org/wiki/Sieve_of_Eratosthenes,wp 上有数学算法
-
@Jägermeister 是的,你说得对,这就是我没有创建相同大小的间隔的原因。因为你说,我的第一个间隔更大,
i数字不会花费i指令(例如,偶数只需要 1 指令)。
标签: java multithreading algorithm primes divide