计算最小值的MInimal时间

时间:2013-11-07 01:23:30

标签: multithreading algorithm concurrency multiprocessing distributed-computing

我被问到这样的问题,计算32个整数的未排序数组的最小值所需的最短时间是多少,因为你有8个核心,每个比较需要1分钟。假设每个核心独立运行,我的解决方案是6分钟。将数组分成8个部分,每个部分有4个整数,8个核心同时计算每个部分的局部最小值,需要3分钟,(每个部分3个比较)。然后4个核心计算这8个局部分钟的局部最小值,1分钟。然后2个核心计算4个局部分钟,1分钟,然后1个核心计算剩余2分钟,1分钟内的全局分钟。因此,总量是6分钟。然而,这似乎并不是面试官所寻求的答案。那么你们怎么想呢?谢谢

3 个答案:

答案 0 :(得分:6)

如果你认为程序是CPU限制的,这是相当荒谬的,但似乎是你的分析所在,那么你需要决定如何划分工作以获得收益多线程的东西。

8个4个整数似乎都是任意的。面试官通常喜欢看一个思考过程。在数学上一般,让我们计算问题子集的总排序。计算总排序有多难,什么是收益?

N个项目的总排序,当两个项目相等时任意挑选,需要N *(N-1)/ 2个比较并消除(N-1)个项目。我们来吧。

  • N = 2:1比较,1消除。
  • N = 3:3比较,2次淘汰。
  • N = 4:6比较,3次淘汰。

显然,使用对(N = 2)效率最高,但如果资源闲置,其他操作也很有用。

  • 分钟1-3:使用N = 2,8的操作消除24名候选人。
  • 分钟4:现在有8名候选人。保持N = 2将使4个核心空闲。设置N = 3每个操作使用2个以上的核,并产生1个消除。那么N = 3的两个操作和N = 2的一个操作,消除2 + 2 + 1 = 5个候选。或者,使用N = 4的6个核心和N = 1的2个核心来消除3 + 1 + 1 = 5.结果是相同的。
  • 分钟5:只剩下3名候选人,所以在最后一轮设置N = 3.

如果让CPU保持忙碌,则需要使用两个更高级别的抽象混合5分钟。花费的能量更多,因为这不是解决问题的最有效方法,但速度更快。

答案 1 :(得分:2)

我将假设比较两个“整数”是一个需要1分钟才能完成的黑盒子,但我们可以缓存这些比较,只进行一次特定的比较。

直到8名候选人(3分钟)才能做到这一点。但是如果你能提供帮助,你不想让核心闲置。假设候选人的编号为1到8.然后在第4分钟,你可以比较:
1v2 3v4 5v6 7v8和1v5 2v6 3v7 4v8
如果我们很幸运,这将消除6名候选人,我们可以使用5分钟来挑选获胜者。

如果我们不幸运,这会留下4个候选人(例如,1,3,6和8),而这一步并没有超过原始方法。在第5分钟,我们需要抛出一切(击败原来的方法)。但是有8个核心,C(4,2)= 6个可能的配对。因此,我们可以进行所有可能的比较(并留下2个核心空闲),并在5分钟内获得胜利。

答案 2 :(得分:-2)

那些是非常大的整数,太大而不适合CPU缓存,所以多线程并不能真正帮助你 - 这个问题是I / O绑定的。 (我想这取决于I / O瓶颈的具体情况,但不要选择尼特。)

由于您需要完全进行N-1比较,答案是31。