Programming Pearls(1)


阅读了第一章

描述了一个实际问题:磁盘排序。之前学排序算法的时候没有意识到:如果内存不足以存放所有数据怎么办?

第 一个方案,之前学过的合并排序显示出其价值,因为我们可以分割所有数据成为能够装入内存的小部分,分别在内存中排序,然后合并起来。可是这种方法有个致命 的缺陷,排好的每一小块数据需要开辟工作文件储存起来,合并时又要再次读取,这样存取的次数实在太多了,而且需要在磁盘开辟工作文件区域,在空间和时间上 都是不佳的解决方案。(敢问那么合并排序有啥用?)

第二个方案是多通道快速排序算法:按照数据的大小分成若干段,多次读取,分别处理,时间和空间上均有改进

第三个方案是位图:该方法只需一次读取一次输出,条件是数据是整数,且最好不能重复,并且不能有关联数据。

在描述的问题背景下,位图方法是最好的1MB的内存可以表示0~1024*1024*8-1的整数。但是实际实现的时候有一些问题,我们看到C和C++并没有提供bit类型,因为现代计算机最小只能提供指向byte的指针,无法直接操作位。

此时我们可以用int型,以及与或移位的方法操作一个int存放32个位标志,看的时候这里卡了一下,因为是不熟悉的东西。

本章最后讲到了三个原则:
1.仔细分析小问题有时会带来巨大的好处。在之前的实习中懂得解决实际问题的能力的重要性,而程序员水准的高低很多时候就是取决于能否想出最佳的解决方案。
2.恰当的问题。解答之前一定要正确地理解问题,而能否正确快速地理解问题又取决于知识的积累。
3.简单的设计。kiss原则:keep it simple stupid。简单的设计不仅实现起来简单,而且往往具有很好的健壮性和易维护性。

另外本章讲到了时间与空间的平衡问题。提到了某些解决方案是能够同时提高时间和空间两方面的性能的,比如本题中的位图方法。

今天啃书啃得相当累,原因是自己对计算机基础知识掌握之薄弱,还是要坚持完成课后习题,多动脑多动手。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值