“找到阵列中的最大值”有多快可能得到?

时间:2011-12-23 11:24:58

标签: algorithm complexity-theory

这个问题来自于另一个问题的讨论: Parallelize already linear-time algorithm。这是作业。

您将获得一个N个数字的数组,以及一个具有P个处理器和共享CREW内存(并发读取,独占写入内存)的计算机。

最快算法上的最严重的 上限是什么,以便在数组中找到最大的数字? [显然,也是:算法本身是什么?]

我不是指所执行的工作总量[永远不会小于O(N)]。

5 个答案:

答案 0 :(得分:8)

我认为它是O(N/P') + O(Log2(P')),其中P'=min{N,P}P'个处理器分别搜索maxN/P'元素,然后并行完成Log2成对合并。第一个P'/2合并由偶数编号处理器完成,接下来是'P'/ 4' - 处理器可以被8整除,然后是16,依此类推。

引入

编辑 P'以涵盖处理器节点数远多于您需要搜索的元素的情况。

答案 1 :(得分:5)

Cook,Dwork和Reischuk表明,任何用于查找最多n个元素的CREW算法都必须在Omega(lg n)时间内运行,即使处理器数量不限且内存不受限制。如果我没记错的话,他们的论文中会出现一个匹配上限的算法:

Stephen Cook,Cynthia Dwork和RüdigerReischuk。没有同时写入的并行随机访问机器的上限和下限时间。 SIAM Journal on Computing,15(1):87-97,1986。

答案 2 :(得分:4)

以下是最佳界限:

如果p <= n / log n,你可以在O(n / p)时间内完成;否则它是O(log n),即当p> n / log n时,与p = n / log n相比,你什么都得不到。

证明 - 下限:

声明1:你永远不能比Ω(n / p)更快,因为p处理器只能加速p

权利要求2:由于CREW模型,你永远不能比Ω(log n)更快(参见unforgiven的论文);如果要检查0-1数组是否至少有一个1,则需要O(log n)时间。

证明 - 上限:

权利要求3:您可以使用n / log n处理器和O(log n)时间

找到最大值

证明:使用n个处理器和记录n时间很容易找到最大值;但事实上,在这个算法中,大多数处理器大部分时间处于休眠状态;通过适当的衔接(参见例如Papadimitriou的复杂性书),它们的数量可以降低到n / log n。


现在,如果给定的处理器少于n / log n,您可以将分配给K个处理器的工作分配给1个处理器,这会将处理器需求除以K并将所需时间乘以K.

设K =(n / log n)/ p;以前的算法在时间O(K log n)= O(n / p)运行,并且需要n /(log n * K)= p个处理器。


编辑:我刚才意识到当p <= n / log n时,dasblinkenlight的算法具有相同的渐近运行时:

n / p + log p <= n / p + log(n / log n)&lt; = n / p + log n&lt; = n / p + n / p&lt; = 2n / p = 0 (N / p)

因此您可以使用该算法,当p <= n / log n时,其复杂度为O(n / p),否则为O(log n)。

答案 3 :(得分:1)

我怀疑这是O(N / P)+ O(P)

  • 在P处理器之间共享工作的成本为O(P)
  • 结合P处理器完成的工作还有O(P)
  • 的成本
  • P处理器对N项的完美并行搜索具有O(N / P)
  • 的时间成本

我天真的算法将是

  • 将项目0写入标有“结果”的CREW单元格
  • 开始P完全独立的搜索,每个搜索通过N个项目中的1 / P
  • 在每次搜索完成后,使用CAS spinloop将“result”替换为部分搜索的结果,如果它更大。 (根据您对CREW的定义,您可能不需要旋转循环)

答案 4 :(得分:1)

对于P = N ^ 2,它是O(1)。

所有初始化布尔数组CannotBeMax [i] = FALSE

Proc(i,j)设置CannotBeMax [i] = A [i]&lt; A [j]的

Max是A [CannotBeMax [i] == FALSE]

请注意,所有并发写入都会尝试写入相同的信息,因此无论哪一个成功,答案都是一致的。