这个问题来自于另一个问题的讨论: Parallelize already linear-time algorithm。这是不作业。
您将获得一个N
个数字的数组,以及一个具有P
个处理器和共享CREW
内存(并发读取,独占写入内存)的计算机。
最快算法上的最严重的 上限是什么,以便在数组中找到最大的数字? [显然,也是:算法本身是什么?]
我不是指所执行的工作总量[永远不会小于O(N)]。
答案 0 :(得分:8)
我认为它是O(N/P') + O(Log2(P'))
,其中P'=min{N,P}
。 P'
个处理器分别搜索max
个N/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)
我天真的算法将是
答案 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]
请注意,所有并发写入都会尝试写入相同的信息,因此无论哪一个成功,答案都是一致的。