文件排序

《Programming Pearls,编程珠玑》开篇后总结的文件排序笔记,主要是笔记“位图数据结构的使用”和“多通道排序”算法。


1 文件排序的思路

  • 调用磁盘排序的库函数。
  • 主存排序。
  • 利用位图数据结构或多通道实现算法。

当主存较排序文件较大时就可以直接采用主存排序:将文件数据全部都读入内存中,然后选择具体的算法如“快排”或“堆排”或“shell排”或“归并排”,然后再将排序后的数据输出到文件中。如果文件的数据过大,主存不能一次性容纳这些数据就必须访问外存,这个时候可以调用磁盘排序的库函数或者利用特殊的数据结构和算法来完成整个排序。


2 主存较小时的排序方法

虽然位于现今儿这个时代里,主存都是以G为单位标识了。但难免会出现《编程珠玑》开篇中所叙述的那样,一个大系统将主存占用的只有少许了,然后这个时候还要对超过主存许多的文件排序。正如书中所述,此时再调用库函数来进行磁盘排序的方法是行不通的,故而作者别出心裁想到了另外的一些方法。


(1) 位图数据结构

位图数据结构:它可以被看成一个字符数组。用数组元素的0和1的状态来记录文件中的元素。如文件中包含| 1, 3, 7, 9 |则定义位图数据结构char bit[10](数组下标是文件的范围上限加1),并通过读文件中的数据将bit[1], bit[3], bit[7], bit[9]元素赋值为1,bit数组的其余元素全都为0。这样就用bit数组的下标标识了文件中的数为1,3,7,9即只要当前数组元素的值为1,则下标值就是文件中的数。


例子:文件file中有范围为1 ~ 1000000的32位不重复整数,主存因某种原因还剩下2M。现需编写程序来对file排序,该如何编程?


分析:1 ~ 1000000的32位整数约占内存为4M(10000000 约为2^20即1M,每个整数占4个字节),主存为2M,那么显然主存排序的方法是靠不上了。若采用位图数据结构,则需要定义char bit[N +1](N = 1000000)占1M内存,每次只需要从file文件中读取一个整数(再需4个字节内存),再加上用位图数据结构编写的代码短小,不会占尽还剩下的1M主存。故而用位图数据结构可以完成任务。


伪码

char bit[N+1]
for i = [0,N]
    bit[i] = 0
for each i in the file
    bit[i] = 1
for i =[0, N]
    if bit[i] == 1
        write to outputfile
bit[i]为1的元素的下标i就是文件中的元素,这些下标是有序的,故而依次输出值为1的元素的下标就得到有序序列。


(2) 多通道

例子:若上个例子中主存只有1M时再对文件整数进行排序。


分析:刚好1 M的主存,再采用位图数据结构来排序主存似乎就随时都具溢出的危险了。还要给内存留点裕度(就算是编写位图数据结构的代码也要占用点内存),所以又有了多通道的排序思路。1M主存约能容下1M / 4 = 250000个32位整数,为留一定的主存,对主存容纳文件数折半即每次只处理文件中的125000个整数,这样1000000个整数分8次就能够读完。且每次都读取文件时都只读取某个范围内的数据,让上一次的排序和下一次的排序自动有序。


伪码

DN = 125000, j = 0
for i = [0, n)    //n为读文件的次数
    for each data from file
        if DN * i <= data < DN *(i + 1)
            a[j++] = data
    qsort(a)    //排此次范围的数
    for each i in a
          write to outputfile

这样,程序每次从文件中读取的数据为DN * i ~  DN *(i + 1)到主存中,随着i的增加,上一次读入的数据都小于当前次读取的数据,故而只要将每次读取到的数据排序后依次输出到文件中就自然让源文件file中的数据有序了。


(3) 位图数据结构排序和多通道排序的总结

位图数据结构使用步骤总结

  • 明确文件的数据范围如0 ~ N以定义位图数据结构char bit[N+1],并初始化bit数组元素都为0。
  • 从文件中读取数据,每读一个数据i就将bit[i]置为1。
  • 处理bit数组元素值为1的下标即文件中的数据。

多通道与位图数据结构的比较

  • 位图数据结构占用内存约为数据的个数(若数不连续则为最大的那个数加1)字节,多通道程序数据所占内存的大小可被调(读的次数越多每次所占内存越小)。位图数据结构程序时间复杂度O(N),多通道为O(N*n),位图数据结构代码更简单。
  • 位图数据结构还可以用于查找等用途。


实际编程时,具体采用哪一种方法对文件排序需结合文件排序的思路,根据实际及预测情况而定。


Small Box Note Over。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值