《编程珠玑》读书笔记(1)

341 阅读2分钟

“如何给一个磁盘文件排序?”

假设这是一个需求,当我们拿到这个需求的时候,最好不要马上动手写,需要先思考这个需求的目的是什么。

显然,这个需求要求我们在磁盘上对文件进行排序。

最直观的想法是,思考排序相关的知识,比如归并排序,然后看怎么能应用到磁盘上。这个过程中你可能需要查阅一些相关资料,然后研究如何编码。

如果任务紧急的话,你或许会去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