基于Batcher比较器的双调排序网络

1. Batcher比较器

  Batcher比较器是指如果在两个输入端给定输入x,y,再在两个输出端输出最大值max{x,y}和最小值min{x,y}。如图1所示,我们规定Batcher比较器的上输出端输出最小值,下输出端输出最大值。

2. 双调序列

  所谓双调序列(Bitonic Sequence)是指由一个非严格增序列X和非严格减序列Y(其中X的最小元素正好是Y的最大元素)构成的序列,比如序列(23,10,8,3,5,7,11,78)。23,10,8为减序列,8,3,5,7,11,78为增序列,8为中间元素。具体的数学定义是酱紫de:

  定义:一个序列a1,a2,…,an是双调序列(Bitonic Sequence),如果

  (1)存在一个ak(1≤k≤n), 使得a1≥…≥ak≤…≤an成立;或者

  (2)序列能够循环移位满足条件(1)

  总的来说,双调序列存在一个中间元素,该元素左边为一个增序列(或减序列),右边为一个减序列(或增序列)。如图2所示(向下和向上的斜线分别表示减序列和增序列):

3. Batcher定理

  Batcher定理是说将任意一个长为2n的双调序列A从中间切成两半,分成等长的两个序列X和Y,然后X和Y相同位置的元素xi与yi比较,小的放到Min序列,大的放到Max序列。由此得到的Max序列和Min序列也是双调序列。且Min序列的每个元素小于或等于Max序列的每个元素。如图3所示:

4. 基于Batcher定理的双调归并网络

  利用Batcher定理,我们可以将任意一个长为2n的双调序列A划分成Min序列和Max序列,再分别对Min序列和Max序列进行划分,以此类推,直到n=1。最后再将所有含两个元素的子序列归并成完全有序的序列。如图4所示:

5. 双调排序网络

  双调归并网络的输入必须是双调序列。如果要将其变成任意输入序列的排序网络,那么首先需要将输入序列转换成一个双调序列。主要思想是:将长度为2n的序列看成n个2个元素的有序序列,任意两个有序序列都可以组成一个4元素双调序列,则可以得到n/2个4元素的双调序列;4元素的双调序列通过一个4个输入的双调归并网络即可得到一个4元素的有序序列;两个4元素的有序序列又可以组成一个8元素的双调序列,再经过一个8输入的双调归并网络即可得到一个8元素的有序序列;以此类推,直到最后得到一个2n个元素的有序序列。如图5所示:

参考文献:

1. Batcher归并网络

2. 双调排序

3. 比较器网络的选择与排序

4. 并行计算——结构·算法·编程(第3版)陈国良编著

时间: 2024-10-25 03:22:41

基于Batcher比较器的双调排序网络的相关文章

ARM与MIPS比较

  ARM MIPS 安全性总览        基于trust zone构建,区分为一个安全世界与一个正常世界,正常世界不可以访问安全世界的存储空间等部件,正常世界信任安全世界,安全世界中的指令互相信任. 基于虚拟化CPU的硬件,允许存在多个域,并且每个域都是独立被保护的,互相不信任其他域中的软件或是数据,MIPS-VZ最多允许255个独立域.这些域运用于不同的模式下:内核模式以及用户模式. ARMv8-M和MIPS-VZ都使用了额外的执行执行模式给与most trusted code以更多权限

CUDA(六). 从并行排序方法理解并行化思维——冒泡、归并、双调排序的GPU实现

在第五讲中我们学习了GPU三个重要的基础并行算法: Reduce, Scan 和 Histogram,分析了 其作用与串并行实现方法. 在第六讲中,本文以冒泡排序 Bubble Sort.归并排序 Merge Sort 和排序网络中的双调排序 Bitonic Sort 为例, 讲解如何从数据结构课上学的串行并行排序方法转换到并行排序,并附GPU实现代码. 在并行方法中,我们将考虑到并行方法需要注意的特点进行设计,希望大家在读完本文后对GPU上并行算法的设计有一些粗浅的认识.需注意的特点如下: 1

Java核心API -- 7(Iterator迭代器、Comparable、Comparator比较器)

1. Iterator迭代器 所有Collection的实现类都实现了iterator方法,该方法返回一个Iterator接口类型的对象,用于实现对集合元素迭代的便利.在java.util包下. 1)Iterator定义有三个方法: ①boolean hasNext()方法:判断指针后面是否有元素. ②E next()方法:指针后移,并返回当前元素.E代表泛型,默认为Object类型. ③void remove()方法:在原集合中删除刚刚返回的元素. 2)对于List集合而言,可以通过基于下标的

基于Verilog的奇数偶数小数分频器设计

今天呢,由泡泡鱼工作室发布的微信公共号“硬件为王”(微信号:king_hardware)正式上线啦,关注有惊喜哦.在这个普天同庆的美好日子里,小编脑洞大开,决定写一首诗赞美一下我们背后伟大的团队,虽然连上我只有两个人,但丝毫不影响我们的工作热情和创业野心.合抱之木,生于毫末:九层之台,起于垒土:千里之行,始于足下! 首先小编在这里分享一个基于Verilog语言的分频器设计,该分频器实现了奇数.偶数.小数(0.5)分频,可综合,能跑700M左右的时钟,基本能够满足大部分应用需求. 一:背景 前天,

关于比较器类的自定义

Job类 /**   * Define the comparator that controls    * how the keys are sorted before they   * are passed to the {@link Reducer}.   * @param cls the raw comparator   * @see #setCombinerKeyGroupingComparatorClass(Class)   */    publicvoid setSortCompar

TreeMap:是基于红黑树的Map接口的实现

> TreeMap:是基于红黑树的Map接口的实现. 红黑树:平衡二叉树 取出时,可以有三种方式:前序遍历,中序遍历,后序遍历 >排序: A 自然排序  --TreeMap无参构造 TreeMap<key类型,value类型> map= new TreeMap<key类型,value类型>(); //key类应当实现Comparable接口,并重写hashCode()和equals()方法 B 比较器排序-TreeMap 比较器有参构造 TreeMap<key类型

【小白的java成长系列】——String类的深入分析(基于源码)

接着前面面向对象来说吧~今天来说说String类..其实String类也包含很多面向对象的知识的~ 首先来问一个问题:我们在开发过程中,如果要使用一个类的话,就要创建对象,这句话没什么问题吧~在实际开发的时候确实是这样的,只有创建了对象才能真正的去使用一个普通的类,我们一般创建对象,几乎所有的类创建对象都是要通过new关键字来创建的~ 问题就来了..为什么我们的String可以直接写成String str = "abc";这样子呢? 当然String类也可以通过new来创建对象的...

创建一个自定义比较器

双列集合: -------------| Map  如果是实现了Map接口的集合类,具备的特点: 存储的数据都是以键值对的形式存在的,键不可重复,值可以重复. ----------------| HashMap  底层也是基于哈希表实现 的. HashMap的存储原理: 往HashMap添加元素的时候,首先会调用键的hashCode方法得到元素 的哈希码值,然后经过运算就可以算出该 元素在哈希表中的存储位置. 情况1: 如果算出的位置目前没有任何元素存储,那么该元素可以直接添加到哈希表中. 情况

MongoShake——基于MongoDB的跨数据中心的数据复制平台

摘要: MongoShake是基于MongoDB的通用型平台服务,作为数据连通的桥梁,打通各个闭环节点的通道.通过MongoShake的订阅消费,可以灵活对接以适应不同场景,例如日志订阅.数据中心同步.监控审计等.其中,集群数据同步作为核心应用场景,能够灵活实现灾备和多活的业务场景. 背景 在当前的数据库系统生态中,大部分系统都支持多个节点实例间的数据同步机制,如Mysql Master/Slave主从同步,Redis AOF主从同步等,MongoDB更是支持3节点及以上的副本集同步,上述机制很