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

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

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

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

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

如果任务紧急的话,你或许会去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
    
复制代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值