Algorithm 找出这个算法的跨度

Algorithm 找出这个算法的跨度,algorithm,html,Algorithm,Html,我有以下算法: 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,B,C,k*grain-size+1, min((k+1)*grain-size,n)) sync ADD-S(A,B,C,i,j): for k=i to j: C[k]=A[k]+

我有以下算法:

  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,B,C,k*grain-size+1, min((k+1)*grain-size,n))

     sync


  ADD-S(A,B,C,i,j):
  for k=i to j:
     C[k]=A[k]+B[k]
好的,我和我的小组进行了以下讨论:

我们想找到这个算法的跨度,我们中的一些人认为它是θ(1)和其他θ(n)


有什么帮助吗

我假设您想要算法的复杂性

因此,您实际上是将两个数组
A
B
添加到另一个数组
C
,并通过生成
r
子进程来实现这一点,每个子进程都会添加
A
B
的一部分长度
粒度

我的理由是:

  • ADD-S
    添加两个数组的
    m=粒度
    元素,因此其复杂性为θ(m)
  • SUM-ARRAY
    生成
    r
    子进程,每个子进程都执行
    ADD-S
    ,因此其复杂性为θ(r*m)=θ(n)

因此,我的答案是θ(n)。

跨度,或临界路径长度,可以是“理论上,在拥有无限多个处理器的计算机上执行工作的最快时间”


在您的例子中,所有派生的迭代都是独立的,所以如果有足够的处理器,所有的迭代都可以同时执行。每次迭代都会处理
粒度
一大块工作。因此,跨度是θ(
晶粒度
),如果以这种方式设置晶粒度,它可以等效于θ(1)或θ(n)甚至θ(sqrt(n))。对于粒度为1的代码,span是θ(1),即与迭代次数无关。

当粒度为1时,span是O(n),因为For循环将花费O(1)的n倍,即使所有子线程将并行运行,父线程仍将为“spawn”操作花费O(1)


来源:这是CS课程算法的解决方案。

大概是为了验证您的想法,您可以实现算法并添加一些日志记录,以查看函数被调用了多少次或其他什么?你试过了吗?我不确定它怎么可能是θ(1),因为它有一个依赖于数组大小的循环。你是说θ吗?为什么是θ(r*m)?我认为产生混淆是因为假设这些过程是并行运行的。是的,james对我们的问题是正确的。就我所见,该算法作为多线程算法不是很有效,但我不确定这是因为我不了解它,还是因为它应该是这样。