环球网校是美国纳斯达克上市企业欢聚时代(NASDAQ:YY)旗下品牌 | 住房和城乡建设部 建筑人才培训合作单位
您现在的位置在: > 计算机类 > 软件水平认证考试 > 考试辅导 >

2011年软件设计师辅导:并行排序算法(1)

2011-03-15 来源:互联网 作者:第一考试网

2011年软件设计师辅导:并行排序算法

#

  先简单说一下给的A,B,C 三种算法(见上面引用的那篇博客),A算法将耗时的平方和开平方计算放到比较函数中,导致Array.Sort 时,每次亮亮比较都要执行平方和开平方计算,其平均算法复杂度为 O(nlog2n) 。 而B 将平方和开平方计算提取出来,算法复杂度降低到 O(n) ,这也就是为什么B比A效率要高很多的缘故。C 和 B 相比,将平方函数替换成了 x*x ,由于少了远程函数调用和Pow函数本身的开销,效率有提高了不少。我在C的基础上编写了D算法,D算法采用并行计算技术,在我的双核笔记本电脑上数据量比较大的情况下,其排序效率较C要提高30%左右。 #

  下面重点介绍这个并行排序算法。算法思路其实很简单,就是将要排序的数组按照处理器数量等分成若干段,然后用和处理器数量等同的线程并行对各个小段进行排序,排序结束和,再在单一线程中对这若干个已经排序的小段进行归并排序,最后输出完整的排序结果。考试大考虑到和.Net 2.0 兼容,没有用微软提供的并行库,而是用多线程来实现。

#

  下面是测试结果: #

  n A B C D #

  32768 0.7345 0.04122 0.0216 0.0254 #

  65535 1.5464 0.08863 0.05139 0.05149

#

  131072 3.2706 0.1858 0.118 0.108 #

  262144 6.8423 0.4056 0.29586 0.21849

#

  524288 15.0342 0.9689 0.7318 0.4906

#

  1048576 31.6312 1.9978 1.4646 1.074

#

  2097152 66.9134 4.1763 3.0828 2.3095

#

  从测试结果上看,当要排序的数组长度较短时,并行排序的效率甚至还没有不进行并行排序高,这主要是多线程的开销造成的。当数组长度增大到25万以上时,并行排序的优势开始体现出来,随着数组长度的增长,排序时间最后基本稳定在但线程排序时间的 74% 左右,其中并行排序的消耗大概在50%左右,归并排序的消耗在 14%左右。由此也可以推断,如果在4CPU的机器上,其排序时间最多可以减少到单线程的 14 + 25 = 39%。8 CPU 为 14 + 12.5 = 26.5%。

#

  目前这个算法在归并算法上可能还有提高的余地,如果哪位高手能够进一步提高这个算法,不妨贴出来一起交流交流。 #

  下面分别给出并行排序和归并排序的代码:

#

  并行排序类 ParallelSort

#

  Paralletsort 类是一个通用的泛型,调用起来非常简单,下面给一个简单的int型数组的排序示例:

#

  class IntComparer : IComparer < int > #

  { #

  IComparer Members #region IComparer Members

#

  public int Compare( int x, int y) #

  {

#

  return x.CompareTo(y); #

  } #

  #endregion #

  } #

  public void SortInt( int [] array) #

  { #

  Sort.ParallelSort < int > parallelSort = new Sort.ParallelSort < int > (); #

  parallelSort.Sort(array, new IntComparer());

#

  }

#

责编: 返回顶部  打印

关于我们联系我们友情链接网站声明网站地图广告服务帮助中心