使用Parallel Thread总计10亿个连续数字,返回一个数字?

时间:2011-09-28 18:20:27

标签: java multithreading

在我的采访中面对这个问题。

我回答的是:

  1. 将1b号码分成10组

  2. 使用threadpool为每个组创建一个线程,10个完全

  3. 每个帖子总结传递的组的结果并返回值

  4. 使用Barrier在10个线程结束后总结所有结果,返回最终值

  5. 我怀疑这个问题的预期答案是什么? 如果它在单CPU中运行(没有多线程模式),单线程应该比多线程快吗?

    非常感谢。

6 个答案:

答案 0 :(得分:7)

也许是一个技巧问题 - 看看你是否可以在盒子外面思考?

如果它们连续,如标题中所述,并且以n开头,那么:

final long BILLION = 1000000000;
long answer = (BILLION * n) + ( BILLION*BILLION + BILLION ) / 2;

这适用于大约十亿左右的n - 之后它会溢出。

毋庸置疑,我看不出多线程会有什么好处!

答案 1 :(得分:2)

我对你的回答非常不满意。 (也许我误解了这个问题。)

不会有更合适的答案:给定参数i和j我希望i,i + 1,i + 2,...,j-2,j-1,j之和

    线程1中的
  1. 计算i *(i + 1)/ 2和
  2. 线程2中的
  3. 计算j *(j + 1)/ 2
  4. 加入主题并计算总和
  5. 请务必使用BigInteger进行算术运算。

    我猜如果i和j非常大,多线程会比单线程更快。但我没有看到超过2个线程的优势

答案 2 :(得分:1)

http://businessmajors.about.com/od/gmatpracticequestions/a/GMATtest1.htm

我认为面对这个问题,我会回答“我会首先研究这个问题,因为我猜测有一个公式化的解决方案可以比蛮力方法更快地给我答案。数学家们已经出现了用公式来解决各种聪明的小问题。找到专家快速有效地解决问题并不会感到羞耻。“

当然,在一次采访中,谁有时间制定这样的答案?

更新:糟糕,我再次阅读你的问题,我看到面试官强迫你使用线程等。尽管如此,我可能已经指出,许多蛮力问题通过一些数学解决得更加优雅。告诉他使用并行线程来运行浏览器,调用Google,进行搜索,并在大约20秒内解决问题。

答案 3 :(得分:0)

在每个帖子中,使用BigInteger继续运行总计 拥有一个受到适当保护的集中式BigInteger(通过屏障或同步)。 当一个线程完成它的运行时,它会在集中的BigInteger上获得一个锁,在线程中加上sum,然后释放锁。

..至少我是这样做的。但安德烈是对的,“回答”只是他们所寻找的一半:)

答案 4 :(得分:0)

你应该说你会在每个线程中添加数字作为BigDecimal对象。完成每个线程后,将数字添加到ArrayBlockingQueue。当队列中有10个对象时,转储队列并遍历每个BigDecimal,添加每个数字。

如果您有多个核心,多线程应该更快。如果你有一个核心,那就会慢一些。

答案 5 :(得分:0)

连续是什么意思?如果它们之间存在规则的间隙,则可以使用第一个值和最后一个值total = n*(last+first)/2的平均值。

如果间隔不是规则的,则一种方法可以按索引对数字进行分组,然后将它们加在一起。如果它们是很大的数字,则可以将它们按每i个数字进行拆分,然后仅在单个线程中将这些i数字相加。与其将整个事情都保留在内存中,不如将较小的块加在一起并保存部分结果,以便可以暂停并继续该过程。

拥有10个内核并不一定意味着使用10个线程是最佳解决方案。操作系统可能使用一个内核,创建组的程序也可能使用一个内核(但是我猜想它会在线程工作之前暂停),通过超线程,您可以使用比内核多一倍的线程。