像寻找2000的阶乘这样的任务,使用BigInteger是一项CPU密集型任务,有没有任何方法可以加速这样的过程?
例:查找2000!因为它只是一个单一的任务,我认为这里不需要线程(因为运行这个程序或在一个线程中运行这个任务都必须执行这种CPU密集型的事情)。
我听说Java7为计算密集型任务引入了一种新的并行机制。那么,我该如何在其中执行这种事情呢?
发布于 2012-01-07 02:19:50
通过最终的合并,一个阶乘可以很容易地拆分成两个任务。这是某种map-reduce,如果你喜欢的话。
示例:
9! = (7*5*3*1) * (8*6*4*2)
所以你可以有两个任务。
这可以概括为任意数量的并行任务。
这个解决方案与Java无关,它是关于将“常规”解决方案转换为并行解决方案。
发布于 2012-01-07 02:10:31
可以简单地向WolframAlpha提交一个查询,并在不到一秒的时间内(at least for 2,000!,甚至10,000,000,000!)返回一个近似答案,如果您只需要一个大阶乘的近似值,这可能就足够了。
这是你自己在维基百科上写的一篇关于challenges around calculating large factorials的文章,其中一些你已经发现了。
您真正想要做的是尝试减少需要完成的总工作量。要做到这一点,最简单的方法是将结果存储在表中,然后进行查找。包含所有这些值的表可能会非常大,但如果存储空间在您的情况下不是限制,那么这是一种方法。
简单地尝试将其并行化不会节省您的CPU (除非您正在计算一个近似值,而不是精确的数字),因为您正在做相同数量的总工作,但将其分散开来。此外,并行化任何东西都会涉及一些开销(线程间/进程间通信,分布式内存,如果问题空间足够大,各种各样的事情)。将任何算法并行化是一大胜利的地方,是当你可以成功地将问题分成更小的块,并将这些块有效地分散开来,以便将时间...
chunks out
results
与系列产品相比,...is的成本更低(以时间、金钱、存储空间、电力或其他有限资源来衡量),并且/或者它提供了一定的价值(时间、金钱、存储空间等。节省了),从而有效地弥补了成本。
https://stackoverflow.com/questions/8762259
复制相似问题