【并行计算】Bitonic Sort(双调排序)基础

双调序列

双调序列(Bitonic Sequence)是指由一个非严格增序列X和非严格减序列Y构成的序列,比如序列(23,10,8,3,5,7,11,78)。

定义:一个序列a1,a2,…,an是双调序列(Bitonic Sequence),如果:
(1)存在一个ak(1≤k≤n), 使得a1≥…≥ak≤…≤an成立;或者
(2)序列能够循环移位满足条件(1)

Batcher定理

将任意一个长为2n的双调序列A分为等长的两半X和Y,将X中的元素与Y中的元素一一按原序比较,即a[i]与a[i+n] (i < n)比较,将较大者放入MAX序列,较小者放入MIN序列。则得到的MAX和MIN序列仍然是双调序列,并且MAX序列中的任意一个元素不小于MIN序列中的任意一个元素。

Bitonic merge(双调合并)

假设我们有一个双调序列,则我们根据Batcher定理,将该序列划分成2个双调序列,然后继续对每个双调序列递归划分,得到更短的双调序列,直到得到的子序列长度为1为止。这时的输出序列按单调递增顺序排列。

由于每次划分后问题长度都会减半,故所需要的划分次数为log n。

这个应用双调划分来对双调序列进行排序的过程称为Bitonic merge(双调合并)。


【并行计算】Bitonic Sort(双调排序)基础_第1张图片
合并一个有16个元素的双调序列


【并行计算】Bitonic Sort(双调排序)基础_第2张图片
双调合并网络

Bitonic Sort(双调排序)

对于两个元素x,y,如果x<=y,则x,y都位于双调序列的递增部分,而递减部分没有元素,如果x>=y,则x,y都位于双调序列的递减部分,而递增部分没有元素,于是x和y构成一个双调序列。因此,任何无序的序列都是由若干个只有2个元素的双调序列连接而成。

于是,对于一个无序序列,我们按照递增和递减顺序合并相邻的双调序列,按照双调序列的定义,通过连接递增和递减序列得到的序列是双调的。最终,我们可以将若干个只有2个元素的双调序列合并成1个有n个元素的双调序列。


【并行计算】Bitonic Sort(双调排序)基础_第3张图片
将无序的输入序列转换成双调序列

如上图,最终再对得到的双调序列进行一次双调合并,即可得到有序序列。

这是今天学到的双调排序的一些基础知识。双调排序多用于并行计算,有空我再针对并行设计总结一下~

你可能感兴趣的:(算法与数据结构,每日算法)