算法导论之排序网络

来源:互联网 发布:哪些域名不能备案 编辑:程序博客网 时间:2024/05/17 06:46
排序网络算法是基于比较网络模型,可以同时执行多个比较操作,和串行计算(随机存取计算机RAM)机制不一样。首先要介绍下比较网络。比较网络由线路和比较器构成。一条线路把一个值从一处传输到另一处,把比较器的输入端和输出端相连。
假定比较网络含n条输入线a1,a2,…,an,以及n条输出线b1,b2,…,bn,需要排序的值通过输入线进入网络,由网络计算出的结果通过输出线输出。算法导论中给出的案例很清晰地表达了比较网络的概念和特点,由线路互联的一组比较器组成。关注两个特点:
第一:只有当同时有两个输入时,比较器才能产生输出值。简单理解,比较器之比较在于有两个值的比较,一个值输入不构成比较意义;
第二:一个比较网络的深度是它的输出线路的最大深度,就是比较器的深度;比较器的深度由最深的线路来决定,如果一个比较器有两条深度分别为dx和dy的输入线路,则其输出线路深度为max(dx,dy)+1;第一个特点也决定了比较器的深度,因为只有输入两个值才算一个深度的开始。
综上,定义排序网络为:对每个输入序列,其输出序列均为单调递增(即b1≤b2≤…≤bn)的一种比较网络。输入n个值(n条线路)经过比较器(深度不同)的比较最后输出n个值正排序。比较器其实就是简单的min和max两个值选择。
1)0-1原理
0-1原理推定认为:如果对于属于集合{0,1}的每个输入值,排序网络都能正确运行,则对任意输入值,它也能争取而运行(输入值可以是整数、实数或者任意线性排序的值的集合)。这样在构造排序网络时,可以专注在0和1组成的输入序列上设计比较器。这个原理目的是简化输入值,而通过0和1来设计比较网络的线路和比较器,只要0和1可运行,那么其他任意值的序列也都可以运行。
0-1原理的证明依赖单调递增函数。如果比较网络把输入序列a=<a1,a2,…,an>转化为输出序列b=<b1,b2,…,bn>,则对任意单调递增函数f,该网络把输入序列f(a)=<f(a1),f(a2),…,f(an)>转化为输出序列f(b)=<f(b1),f(b2),…,f(bn)>。
这个可以这样理解,就是对输入序列a施以f(a)单调递增函数,比较网络(线路和比较器)能够使序列a输出序列b,那么该比较网络同样可以使输入序列f(a)输出序列f(b)。
这就为0-1原理奠定了基础,只要证明比较网络可以运行于0和1的输入,那么设计一个单调递增函数,0和1是因变量,其自变量自然也可以通过同样比较网络来排序。
如果一个具有n个输入的比较网络能够对所有可能存在的2n个0和1组成的序列进行正确的排序,则对所有任意数组成的序列,该比较网络也可能对其正确排序。
0-1原理证明用到了单调递增函数概念,同时采用数学归纳法和反证法来证明。这也给出了一个很重要的思想,那就是对现实问题的解决,在构建数学模型时,可以简单到0-1,然后再推广到复杂数。
2)双调排序网络
基于0-1原理构造有效的排序网络,首先是构造能对任意双调序列进行排序的比较网络,再合并网络。
那么什么是双调序列呢?双调序列是指序列要么单调递增后再单调递减,或者循环移动成为先单调递增后再单调递减。考虑边界情况,任何1个或2个的数构成的序列都是双调的,双调0-1序列的结构是0i1k0j或1i0k1j,其中i、j、k≥0,自然单调递增或单调递减的序列也是单调的。
怎么理解双调序列呢?比喻为山峦起伏,一山比一山高再一山比一山低,中间是单调性的。基于0-1原理,只要我们所构造的双调排序程序能对0和1的双调序列进行排序的比较网络,这个比较网络也适用于任何数值。
双调排序通过迭代半清洁器来实现。半清洁器就是深度为1的比较网络,输入双调序列,进行深度1次的比较器,输出双调序列,而“半”的意思是指比较器的两个输入值是由输入线i和输入线i+n/2进行比较。双调序列经过半清洁器输出的双调序列结果是:较小的值位于输出的上半部,较大的值位于输出的下半部,并且两部分的序列仍然是双调的。为此得出如下结论:
如果半清洁器的输入是一个由0和1组成的双调序列,则其输出满足如下性质,输出的上半部分与下半部分都是双调的,上半部分输出的每一个元素至少与下半部分输出的每个元素一样小,并且两部分中至少有一个部分是清洁的。
输入双调序列,然后递归连接半清洁器,就可以建立一个双调排序器,实现对双调序列排序的比较网络。
3)合并网络
合并网络,能够把两个已排序的输入序列合并为一个有序的输出序列的网络。基于双调排序网络思想,对已知的两个有序序列进行连接(第二个序列顺序颠倒),所得的序列是双调序列,再利用双调排序器就能完成两个有序序列的合并。
4)排序网络
基于0-1原理、双调排序网络、合并网络,我们可以构造一个输入任意序列进行排序的比较排序网络。思想很简单:第一步开展最基础的2个元素的两两比较,这个用普通的比较器就可以实现,输出长度为2的有序序列;第二步对长度为2的有序序列进行两两合并,这个用合并网络排序(基于双调排序器,先连接序列构造双调序列)实现,输出长度为4的有序序列;第三步对长度为4的有序序列进行合并网络,直到lgn次。算法上,可以在O(lg2n)内并行地对n个数进行排序。
排序网络可以并行地进行排序,然后再组合各并行排序结果,适合分布式场景的排序需求。
0 0