桶排序和样本排序(Bucket Sort and Sample Sort)

来源:互联网 发布:淘宝卖家漏发货怎么办 编辑:程序博客网 时间:2024/05/29 17:39

原文地址:http://parallelcomp.uw.hu/ch09lev1sec5.html

9.5桶排序和样本排序

桶排序(bucket sort)算法是一种流行的串行算法,用于排序包含n个元素数组,其值在区间[a, b]上匀分布。在该算法中,区间[a, b]被分为m个大小相等的子区间称为,并且每个元素被放置在适当的桶中。由于n元素在区间[a, b]上均匀分布,每个桶的元素数目大致为n/m。然后,该排序算法对每个桶中的元素进行排序。该算法的运行时间是Q(nlog(n/m)),格式化Q(n)它具有线性运行时间:Q(n)。需要注意的是该桶排序之所以能达到很低复杂度,因为它假设进行排序的n元素在区间[a, b]上是均匀分布的。

并行桶排序很简单。让n被排序元素的数量,p是进程数目。最初,每个进程被分配了大小为n/p个元素的块,并且桶的数量m=p。并行桶排序包括三个步骤。在第一步骤中,每一个进程划分其n/p元素为p个子块,每个子块对应每个桶。这是可能的,因为每个进程都知道在区间[a, b]上,从而知道每个桶的区间。在第二步骤中,每一个进程发送子块到桶对应的进程。在此步骤之后,每个进程只有属于分配给它的桶中的元素。在第三步骤中,每一个进程通过使用最优顺序排序算法在内部排序其桶。

不幸的是,假设输入元素在区间[a, b]上均匀分布是不现实的。在大多数情况下,实际的输入可以不具有这样的分布,或它的分布可能是未知的。因此,使用桶排序可能会导致各个桶中的元素数量显著不同,从而降低排序性能。在这种情况下的使用称为样本排序(Sample Sort)算法将产生更显著的性能。样本排序的想法很简单。大小为s的样本从n元素的序列中选取,并且选择样本排序后m-1个元素确定桶的范围。这些元素(称为分离器(splitter))用来分离m大小相等的桶。确定桶的范围后,该算法变成了一般方式的桶排序。样本排序的性能取决于样本的大小s和从n个元素中选定样本的方式。

考虑一个分路选择方案,它保证在每个桶在结束后元素的数目大致相同。设n为元素的数量m是桶的数量。该方案的工作原理如下,把n元素分入m大小为n/m的块中,分别用快速排序对每个块排序。从每个已排序的块中选择m-1均匀分布的元素。总共选取m(m-1)个元素作为样本,并以此来确定每个桶的范围。这种方案保证,每个桶在结束时元素的数量小于2n/m(问题9.28)。

我们怎样才能并行分离器选择方案?设p是进程数。在桶排序中,设定m=p 因此,在算法结束时,每个进程仅包含属于单个桶的元素。每个进程都被分配了一个n/p元素大小的块,并且进行排序。然后从中选择p-1个均匀间隔的元素。每个进程发送p-1样本元素到一个特殊的进程P0。然后进程P0p(p-1)样本元素排序,并且从中选择均匀间隔的p-1元素作为分离器。最后,进程P0p-1分离器广播到所有其他进程。现在,该算法与桶排序的方式相同。这种算法示于9.20

图9.20。样品排序与三个进程24元件阵列上执行的一个例子。


分析 我们现在分析样本排序的复杂性,在一个消息传递的计算机上p的进程和O(p)的二分带宽。

内部排序n/p元素需要时间Q((n/p)log(n/p)),选择p-1样品元素需要时间Q(P)。发送p-1的元素来处理P0类似于收集操作(4.4);所需要的时间是Q(P2)。在P0上对p(p-1)个样本元素排序的时间是Q(p2logp),以及选择p-1个分离器时间是Q(p)。该对p-1分离器是由使​​用一个对所有进程的广播(发送给所有其它进程4.1),这需要时间Q(plogp)。每个进程可以将这些p-1分路器大小的本地排序块n/p通过对p-1的二分搜索。每个进程从而分隔它的块分成p个子块,与每个桶相对应。这种划分需要的时间是Q(plog(n/p))。每个进程然后发送子块到相应进程(即,桶)。对于此步骤的通信时间是难以计算精确的,因为它依赖于子块的大小来进行通信。这些子块可以在0和任意变化n/p。因此,上界的沟通时间Ø(n)+Ö(plogp)

如果我们假设存储在每个处理元件是均匀分布的,则每个子块具有大致Q(n/p2)的元素。在这种情况下,并行运行时间是

公式9.9

 

在这种情况下,等价效率函数是Q(p3logp)。如果双调排序用于将排序p(p-1)样品的元素,那么样本排序时间将是Q(plogp),并且等价效率将减少到Q(p2logp)(问题9.30)。

0 0
原创粉丝点击