【问题标题】:Obtain primes with threads. How to divide intervals?用螺纹获得素数。如何划分区间?
【发布时间】: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


【解决方案1】:

我认为您正在寻找一种并行方法。 这就是 work stealing 算法的设计目的,也就是 Fork Join Pool。事实上,素数计算是工作窃取的典型用例,因为判断n 是否为素数需要迭代到sqrt(n),所以n 越大,花费的时间就越长。因此,将它们平均分配给您的工作人员并等待每个工作人员完成其工作是不公平的,第一个核心将快速确定 n 是否为素数并闲置,而另一个核心将继续忙于计算更大的数字。随着工作窃取空闲处理器将从其邻居队列中窃取工作。

This implementation might be useful.

【讨论】:

    【解决方案2】:

    我解决了这个问题。我没有对间隔进行第一次完整划分并将每个部分分配给不同的服务器。我决定将间隔分成非常小的部分(例如[min, max]/length^2),每个微积分服务器都有这些部分之一。当他们完成时,他们会得到另一个,直到没有更多的小间隔可以计算。

    我为什么要这样做?原因是我无法确保我正在使用的服务器具有相同的微积分速度。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-13
      • 2019-12-26
      • 1970-01-01
      相关资源
      最近更新 更多