桶排序的并行优化算法摘要本文从桶排序出发,提出了新的并行的桶.doc

桶排序的并行优化算法摘要本文从桶排序出发,提出了新的并行的桶.doc

  1. 1、本文档共10页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
桶排序的并行优化算法摘要本文从桶排序出发,提出了新的并行的桶

桶排序的并行优化算法 摘要:本文从桶排序出发,提出了新的并行的桶排序的程序实现方案,并把用于并行的额外开销减少到了一个比较理想的范围内。它的效率比原实现方式提高了41%,而且突破了原始桶排序内存的限制,使能桶排可以真正的处理大量数据。 关键词:优化 桶排序 并行 空间 引言: 排序可以说是在计算机中最常见的问题之一了,而且不论是在操作系统,人工智能,计算机网络还是各种应用,都对于排序有大量的需求,因此设计出来一种效率高,开销少的排序算法就显得格外重要。于此同时,随着计算机的高速发展,传统的单线程排序已经不能为人所接受,本文基于桶排序,提出了一种并行化的优化桶排算法,不同于原始桶排,该算法在时间复杂度上都有了35%的提高。同时这种桶排序,对于内存有很大开销,不利于处理大量数据,于是我们提出了基于链表的新的桶排序算法,在各个数据进桶时采用指针将各个数据练成一个表,而不是原始的拷贝方法,这种方法极大地减少了内存的使用,而且,研究又将链表方式的桶排序并行化,效率提高了。 原始桶排序: 桶排序的典型实现方式是基于数组的(Array-Based Bucket Sorting),以下简称ABS。其物理结构如图所示。 数据规模为N时,图中的大小为N的一维数组用于存放数据,叫做Buckets的Buffer是一个10*N的二位数组,其中,第1行代表0号桶,第2行代表1号桶…….?以此类推。桶号对应了一个数字特定位的值。 其排序过程用一个例子说明:有2,10,22三个数依次排在一维数组中。首先,比较个位:从左到右依次取数,2的个位是2,放入2号桶(桶中也是从左到右依次排放)。取10,放入00号桶;取22,放入2号桶;然后对桶从上到下,从左到右依次遍历,取出数据,回填到一维数值中。此时一维数组中存放顺序是10,2,22;再比较十位,投入桶中并填回,此时一维数值中存放顺序是2,10,22。由于最大的位数是十位,故做两次即停止,排序完成。 从上例中可以看出,桶排序中有两个主要部分——“投桶”和“回填”;对于规模为N的排序,数据的最大位数为M时,排序的时间复杂度为O(MN),所以ABS的速度是很快的。 基于链表的桶排序(LBS) 桶排序算法的特点是快速,缺点也十分明显——内存占用量巨大。我们考察上述基于数组的桶排序,排序数据数量为N时,存储数据的一维数组大小为N,为了确保排序的正确性,每个桶的容量必须为N,共计10个桶。C++中,int型占4个字节,可知,所需的内存容量(C)有:C=(10+1)*N*4 Byte=44N Byte。以5千万个数为例,内存容量至少为2.0489G,值得注意的是,实际存数用的内存仅占1/11。桶排的缺点显然严重制约了其能处理的排序规模,直接削减了实际应用价值。因而,我们提出了极大改善这一缺点的实现算法:基于链表的桶排序(Linklist-Based Bucket Sorting),以下简称LBS。如图所示,用于存储数据的一维数组由链表代替,链表中的节点由两个属性组成:int型的数据值和指向下一个节点的指针。桶的构成如图所示。每个桶其实是指向一个节点的指针。“投桶”的过程为:从左到右遍历链表中的每个节点;对于一个特定节点,取其数据值,计算出对应桶号,在相应桶的队尾链入此节点。 这里,我们也将“回填”称为“拉直”,其过程为:从0号到9号,对于不为空的桶,将其队尾节点与下一个不为空的桶的头结点相连(即指针指向头结点)。这样衔接完成后,“弯曲”的链表就被拉直了,形成了更为有序的新链表。我们先从理论上比较LBS和ABS性能:投桶时,LBS中仅仅修改了节点的指针,而节点物理位置并未迁移,与ABS的数据复制本质相同,均为赋值,所以时间开销相近;回填时,LBS只需要做首尾连接,时间开销是常数的,而ABS需要将桶中的数据全部赋值回一维数组,时间开销是O(n),数据量越庞大,ABS回填越耗时,而LBS基本不用时间。与此同时,理论上的空间开销也大大消减。对于LBS,数据量为N时,必须的节点数为N,C++中指针占4个字节,所以必须内存C=(4+4)*N =8N Byte. N=5千万时,内存容量至少为381.47M,只有ABS的18.2%。 所以理论上建模的结果是:LBS在时空上均优于ABS,且空间节省上效果显著。 我们使用C++重新构造了基于LBS的桶排序,同样的硬软件环境下,排序的规模由ABS的不到5千万,到当前轻松上亿。经测试,最大规模接近三亿。至此,我们提升“桶排序可处理规模”的目标完全达到。 与此同时,对排序时间的测试数据如下表所示: 表中的数据与理论预期的结果完全不符——LBS用时远远大于ABS。进一步分析有:“回填”方面,LBS几乎不耗时间,绝对强于ABS;“投桶”方面,LBS每次都比ABS更耗时,而巨大的用时差距

文档评论(0)

youbika + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档