Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 您能在O(n/p)时间内进行并行计数排序吗?_Algorithm_Sorting_Parallel Processing_Counting Sort - Fatal编程技术网

Algorithm 您能在O(n/p)时间内进行并行计数排序吗?

Algorithm 您能在O(n/p)时间内进行并行计数排序吗?,algorithm,sorting,parallel-processing,counting-sort,Algorithm,Sorting,Parallel Processing,Counting Sort,可以并行进行计数排序并实现O(n/p)运行时吗 举个例子,我们有一个数组,其中有数百万个元素,范围从1到10。合并排序将在不超过O(nlogn)的时间内运行。应用于此问题的计数排序将在O(n)时间内运行。并行计算排序可能很有趣。如果我们为每个处理器分配一个具有n/p元素的子阵列,并且每个处理器都有自己的大小为9的计数数组,则累积元素计数的初始步骤应花费O(n/p)时间。将所有count数组合并到单个数组中需要O(p)时间,因为您只需要迭代p个count数组,每个数组的大小都是常量 我还没有完全思

可以并行进行计数排序并实现O(n/p)运行时吗

举个例子,我们有一个数组,其中有数百万个元素,范围从1到10。合并排序将在不超过O(nlogn)的时间内运行。应用于此问题的计数排序将在O(n)时间内运行。并行计算排序可能很有趣。如果我们为每个处理器分配一个具有n/p元素的子阵列,并且每个处理器都有自己的大小为9的计数数组,则累积元素计数的初始步骤应花费O(n/p)时间。将所有count数组合并到单个数组中需要O(p)时间,因为您只需要迭代p个count数组,每个数组的大小都是常量

我还没有完全思考计数排序的最后一步,元素是按顺序排列的。如果count数组的元素是原子的,则可以将原始数组的n/p部分分配给各个处理器并实现一些并行化,但是count数组的各个元素上会存在争用,这可能会大大减少并行化。如果输入数组全部为10,则所有处理器将在计数数组的第9个元素上序列化,从而将算法效率降低到O(n)

您可以将count数组的子数组分配给p个处理器中的每一个,然后返回到O(n/p)运行时,但前提是元素分布相当均匀。在我们的示例中,您将被限制为10个处理器。如果元素分布不均匀,则一个或多个处理器可能会执行更大比例的工作。例如,如果输入数组中有一半的元素是10,那么一个处理器就必须单步通过一半的数组。最坏的情况是,该阵列全部为10个,单个处理器必须逐步完成整个阵列,将运行时转换为O(n)

也许可以在多个处理器之间划分计数数组的各个元素。例如,如果输入数组中有50个10,则count数组的元素9将反映这一点。您可以让5个处理器将每个10写入输出阵列中的正确位置。如果count数组的每个索引位置上的元素少于p个,这将再次转移到O(n)运行时,但它避免了元素值分布不均匀的问题


可以在O(n/p)时间内进行计数排序吗?

是的,可以。将数组分成等长的
p
部分。然后为每个进程创建一个计数数组“c”。让每个进程计算元素的数量,并将它们存储在
c
中。这将需要
O(n/p)
。现在将所有计数数组
c
添加到一起,并使数组共享给所有进程。这将采用
O(p*b)
,其中
b
是可能值的数量。到目前为止,这正是你的方法。现在您可以在
p
过程中重新创建数组,因为您可以从
c
计算值的第一个和最后一个索引。对于每个值
i
,其第一个索引是
c
中所有先前值的总和。它的最后一个索引是它的第一个索引加上
c[i]
。此计算可在
O(i)
中完成,其中
i
b
小,因此小于
O(b)
。每个进程现在都可以重新填充自己的部分。这同样需要
O(n/p)
。总而言之,您有
n/p+p*b+b+n/p
。如果
p*b,你会想了解一下。无论您如何“并行”创建一个特定的进程,该进程的某些组件将只能以串行方式运行,并将主宰执行时间。是的,在这种情况下,我完全看到了这一点。在特定情况下,O(n/p)似乎是可以实现的,但一般情况下更难实现。在这种情况下,并行性的唯一好处是大小为9的p本地数组的缓存增量,但正如Marc B所提到的,计数部分可能比O(n)发生得更快从主存读取或写入数百万个元素所需的时间,因此该过程的主存带宽有限,并行性也不会有多大帮助。你可以随时进行基准测试,看看它是否有什么不同。我想这会管用的!另一个注意事项是,计数数组合并运行时可以减少为对数。我们可以让处理器合并两个计数数组,然后合并结果数组,依此类推,直到只有一个计数数组,而不是让一个进程迭代每个计数数组。