“如何给一个磁盘文件排序?”
假设这是一个需求,当我们拿到这个需求的时候,最好不要马上动手写,需要先思考这个需求的目的是什么。
显然,这个需求要求我们在磁盘上对文件进行排序。
最直观的想法是,思考排序相关的知识,比如归并排序,然后看怎么能应用到磁盘上。这个过程中你可能需要查阅一些相关资料,然后研究如何编码。
如果任务紧急的话,你或许会去Github和StackOverflow上看看有没有现成的代码可以参考。一番调试后,程序能跑起来了,OK,问题解决,等待下一个需求。
不过,这种做法真的正确吗?
作者提出了几个问题:
为什么非要自己写程序?为什么不用系统提供的排序功能呢?
需要排序的内容是什么?文件中有多少记录?每条记录的格式是什么?
为什么不在内存里排序?
……
复制代码
通过这些问题,作者将已知条件组织成一种更直观明了的方式,最终提炼出了需求中数据结构的特性——有限定义域内的稠密集合,其中的每一个元素最多出现一次。
于是引入了位图。
整个需求本质上是排序n个不重复的整数集合。
通过将输入的数字映射到位图中的指定唯一位置,可以在遍历集合的时候完成排序。位图占用空间小,所以这个排序的时间复杂度可以近似认为是O(1)。
最后附上算法的伪代码如下:
// phase 1: initialize set to empty
for i = [0, n)
bit[i] = 0
// phase 2: insert persetn elements into the set
bit[i] = 1
// phase 3: write sorted output
for i = [0, n)
if bit[i] == 1
write i on the output file
复制代码