找到此算法的范围

问题描述

| 我有以下算法:
  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课程算法的解决方案中获得的。     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...