多路平衡归并+置换选择+最佳归并树

多路平衡归并+置换选择+最佳归并树

    最近忙着考研,在学习复习数据结构(严慧敏版)外部排序那一章的时候简直开始怀疑人生了。以前我是怎么过来的?!败者树能吃吗??置换选择不就是操作系统页面换进换出的概念??TO YOUNG  TOO SIMPLE  SOMETIMES NAIVE !! 本文是个人对以上归并排序的三个算法的理解,如有错误请指出。好了废话少说,下面是正题。

    众所周知,快速排序,希尔排序以及基数排序等内部排序算法只针对内存里的数据进行排序,也就是说如果要排序1G的数据就至少要分配1G的内存。当文件再大一点计算机就顶不住了,更别说现在都有蓝光A片了(好吧反正也不会蛋疼到对一部影视作品进行排序)

    这时候归并排序就能排上用场了。我相信来看这篇小文的老哥小妹都已经懂得普通的2路归并排序了,我就直接从多路归并排序开始讲。

    归并排序(k路)有以下几个特点:

  1.     输入是k个排好序的文件
  2.     算法对每个文件的操作是 顺序历遍(从左到右),并且只历遍一次
  3.     输出是1个排好序的文件

    第一和第三个特点使得归并算法可以这样实现:每次读k个文件到内存,排好序,输出到一个文件,再重复操作。

    但这样有个问题,k个小文件合并后的文件会越来越大,可以大到内存无法承受的程度。这时候第二个特点就发挥作用了。

    顺序历遍一次允许我们将刚从文件里读进来的数据操作完成后立刻丢弃(释放内存)。

    所以归并算法可以这样实现:维护固定大小的k个循环队列,对应于k个文件指针,每次从文件读进一个数据到队列覆盖以前的数据(因为以前的数据历遍完就没用了),操作完成后,循环队列的指针就往前走。所以文件流的输入操作和顺序历遍简直就是洛与霞好不!

    这样一来归并排序就可以通过固定内存来完成外存文件的排序。

    但是算法嘛,我们总得讲究时间复杂度。因为外存的读写速度远远慢与内存的读写速度,所以外部排序所需的时间主要取决于对外存的读写上。那么对外存的读取次数有影响的变量是什么呢?

    试想要排序4个排好序的文件(这4个文件怎么来的先别管),如果是2路归并,那么就需要2趟,而每一趟都需要对文件进行一次历遍(也就是外存的读写)。但如果是4路归并,那么就只需要1趟,这样一来就减少了对外存的读写次数。

    所以我们可以简单地认为:k路归并排序的k值越大,排序所需要时间越短。

    试想一个大文件被均等分成4份,也就是有4个排好序的文件,对于2路归并,需要2趟。但如

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值