问题描述
|
我有以下算法:
SUM-ARRAY(A,B,C):
n = A.length
grain-size = 1
r = ceil(n/grain-size)
for k = 0 to r-1:
spawn ADD-S(A,C,k*grain-size+1,min((k+1)*grain-size,n))
sync
ADD-S(A,i,j):
for k=i to j:
C[k]=A[k]+B[k]
好的,我与小组进行了以下讨论:
我们想找到该算法的跨度,我们中的一些人认为它是theta(1)和其他theta(n)。
有什么帮助吗?
解决方法
跨度或关键路径长度可以定义为“理论上可以在具有无限数量的处理器的计算机上执行工作的最快时间”。
在您的情况下,所有生成的迭代都是独立的,因此如果有足够的处理器,则可以同时执行所有迭代。每次迭代都需要ѭ1的大工作。因此,跨度为Theta(
grain-size
),如果以这种方式设置晶粒大小,则可以等于Theta(1)或Theta(n)甚至Theta(sqrt(n))。如代码中所示,对于1的晶粒大小,跨度为Theta(1),即与迭代次数无关。
,我假设您想要算法的复杂性。
因此,您实际上是将两个数组A
和B
添加到另一个数组C
中,并通过生成r
子过程来进行此操作,每个子过程都将length3ѭ和B
的一部分长度grain_size
相加。
我这样说:
ADD-S
将两个数组的m = grain_size
元素相加,因此其复杂度为Theta(m)
SUM-ARRAY
产生r
个子过程,每个子过程都做ADD-S
,因此其复杂度为Theta(r * m)= Theta(n)
因此,我的答案是Theta(n)。
,当grain-size为1时,跨度为O(n),因为for循环将是O(1)的n倍,即使所有子代都并行运行,父线程仍将为O(1)。 \“ spawn \”操作。
资料来源:这是从CS课程算法的解决方案中获得的。