Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用并行线程对10亿个连续数字求和,返回一个数字?_Java_Multithreading - Fatal编程技术网

Java 使用并行线程对10亿个连续数字求和,返回一个数字?

Java 使用并行线程对10亿个连续数字求和,返回一个数字?,java,multithreading,Java,Multithreading,我在面试中遇到了这个问题 我的回答是: 将1b数字分成10组 使用threadpool为每个组创建一个线程,总共10个 每个线程汇总传递的组的结果并重新运行该值 使用Barrier对10个线程结束后的所有结果进行汇总,返回最终值 我的疑问是这个问题的预期答案是什么? 如果它在单cpu无多线程模式下运行,单线程是否应该比多线程更快 非常感谢。在每个线程中,使用BigInteger来保持总计。 有一个集中的BigInteger,它受到屏障或同步的适当保护。 当一个线程完成其运行时,它会在集中的Big

我在面试中遇到了这个问题

我的回答是:

将1b数字分成10组

使用threadpool为每个组创建一个线程,总共10个

每个线程汇总传递的组的结果并重新运行该值

使用Barrier对10个线程结束后的所有结果进行汇总,返回最终值

我的疑问是这个问题的预期答案是什么? 如果它在单cpu无多线程模式下运行,单线程是否应该比多线程更快


非常感谢。

在每个线程中,使用BigInteger来保持总计。 有一个集中的BigInteger,它受到屏障或同步的适当保护。 当一个线程完成其运行时,它会在集中的BigInteger上获得一个锁,添加线程总数,然后释放锁


至少我会这么做。但是Andrey是对的,“答案”只是他们想要的一半:

在每个线程中,使用一个大整数来保持总计。 有一个集中的BigInteger,它受到屏障或同步的适当保护。 当一个线程完成其运行时,它会在集中的BigInteger上获得一个锁,添加线程总数,然后释放锁


至少我会这么做。但是Andrey是对的,“答案”只是他们想要的一半:

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


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

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


如果有多个内核,多线程应该更快。如果你有一个核心,速度会慢一些。

我对你的答案极不满意。也许我误解了这个问题

更合适的答案是:给定参数i和j,其中我想要i,i+1,i+2,…,j-2,j-1,j的和

在线程1中,计算i*i+1/2和 在螺纹2中,计算j*j+1/2 连接线程并计算总和 确保在算术中使用BigInteger


我猜如果I和j是非常大的数字,多线程将比单线程更快。但是我看不出超过两条线的好处,我对你的回答非常不满意。也许我误解了这个问题

更合适的答案是:给定参数i和j,其中我想要i,i+1,i+2,…,j-2,j-1,j的和

在线程1中,计算i*i+1/2和 在螺纹2中,计算j*j+1/2 连接线程并计算总和 确保在算术中使用BigInteger


我猜如果I和j是非常大的数字,多线程将比单线程更快。但是我不认为超过两个线程有什么好处,也许这是一个技巧性的问题——看看你是否能跳出既定的框框思考

如标题所述,如果它们是连续的,且以n开头,则:

final long BILLION = 1000000000;
long answer = (BILLION * n) + ( BILLION*BILLION + BILLION ) / 2;
这对n起作用,大约在10亿左右——之后它将溢出


不用说,我看不出多线程有什么好处

也许是一个技巧性的问题——看看你是否能跳出既定的框框思考

如标题所述,如果它们是连续的,且以n开头,则:

final long BILLION = 1000000000;
long answer = (BILLION * n) + ( BILLION*BILLION + BILLION ) / 2;
这对n起作用,大约在10亿左右——之后它将溢出

不用说,我看不出多线程有什么好处

我想面对这个问题,我会先研究这个问题,因为我猜有一个公式化的解决方案比暴力方法更快地给出答案。数学家们已经提出了解决各种各样聪明的小问题的公式。找一位专家快速有效地解决问题并不丢脸

当然,在一次采访中,谁有时间给出这样的答案

更新:哎呀,我又读了一遍你的问题,我看到面试官强迫你使用线程之类的东西。不过,我可能已经指出,许多蛮力问题通过一点数学运算就能更优雅地解决。告诉他使用并行线程运行浏览器,打电话给谷歌,进行搜索,并在大约20秒内解决问题

我想面对这个问题,我会先研究这个问题,因为我猜有一个公式化的解决方案可以给我答案 比暴力手段更快。数学家们已经提出了解决各种各样聪明的小问题的公式。找一位专家快速有效地解决问题并不丢脸

当然,在一次采访中,谁有时间给出这样的答案


更新:哎呀,我又读了一遍你的问题,我看到面试官强迫你使用线程之类的东西。不过,我可能已经指出,许多蛮力问题通过一点数学运算就能更优雅地解决。告诉他使用并行线程运行浏览器,调用Google,进行搜索,并在大约20秒内解决问题。

你所说的连续是什么意思?如果它们之间有规则的间隔,则可以使用第一个和最后一个值的平均值total=n*last+first/2

如果差距不是规则的,那么有一种方法可以通过索引将数字分组,并以这种方式将它们相加。如果它们是大数字,那么您可以将它们按每个i位数拆分,并在单个线程中仅将该i位数相加。我宁愿把较小的数据块加在一起并保存部分结果,这样就可以暂停并继续这个过程,而不是将整个过程保存在内存中


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

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

如果差距不是规则的,那么有一种方法可以通过索引将数字分组,并以这种方式将它们相加。如果它们是大数字,那么您可以将它们按每个i位数拆分,并在单个线程中仅将该i位数相加。我宁愿把较小的数据块加在一起并保存部分结果,这样就可以暂停并继续这个过程,而不是将整个过程保存在内存中


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

与大多数面试问题一样,没有单一或正确的答案,通常,面试官会关注你解决问题的能力,而不是给出预期的答案。此外,面试官可能不会给出所需的全部细节,他也可能会在你开始解决问题之前向你提问,因为大多数面试问题都没有单一或正确的答案,通常,面试官会关注你解决问题的能力,而不是给出预期的答案。此外,面试官可能不会给出所需的全部细节,他也可能会期待在你开始解决问题之前,有人向你提问。数字不一定以1开头。因此,多线程可能有助于计算两个和。@emory-答案不一定以1开头。它以n开头。n可以是任何小于10亿的正整数。数字不一定以1开头。因此,多线程可能有助于计算两个和。@emory-答案不一定以1开头。它以n开头。n可以是任何小于10亿的正整数。