阅读了第一章
描述了一个实际问题:磁盘排序。之前学排序算法的时候没有意识到:如果内存不足以存放所有数据怎么办?
第 一个方案,之前学过的合并排序显示出其价值,因为我们可以分割所有数据成为能够装入内存的小部分,分别在内存中排序,然后合并起来。可是这种方法有个致命 的缺陷,排好的每一小块数据需要开辟工作文件储存起来,合并时又要再次读取,这样存取的次数实在太多了,而且需要在磁盘开辟工作文件区域,在空间和时间上 都是不佳的解决方案。(敢问那么合并排序有啥用?)
第二个方案是多通道快速排序算法:按照数据的大小分成若干段,多次读取,分别处理,时间和空间上均有改进
第三个方案是位图:该方法只需一次读取一次输出,条件是数据是整数,且最好不能重复,并且不能有关联数据。
在描述的问题背景下,位图方法是最好的1MB的内存可以表示0~1024*1024*8-1的整数。但是实际实现的时候有一些问题,我们看到C和C++并没有提供bit类型,因为现代计算机最小只能提供指向byte的指针,无法直接操作位。
此时我们可以用int型,以及与或移位的方法操作一个int存放32个位标志,看的时候这里卡了一下,因为是不熟悉的东西。
本章最后讲到了三个原则:
1.仔细分析小问题有时会带来巨大的好处。在之前的实习中懂得解决实际问题的能力的重要性,而程序员水准的高低很多时候就是取决于能否想出最佳的解决方案。
2.恰当的问题。解答之前一定要正确地理解问题,而能否正确快速地理解问题又取决于知识的积累。
3.简单的设计。kiss原则:keep it simple stupid。简单的设计不仅实现起来简单,而且往往具有很好的健壮性和易维护性。
另外本章讲到了时间与空间的平衡问题。提到了某些解决方案是能够同时提高时间和空间两方面的性能的,比如本题中的位图方法。
今天啃书啃得相当累,原因是自己对计算机基础知识掌握之薄弱,还是要坚持完成课后习题,多动脑多动手。
Programming Pearls(1)
最新推荐文章于 2025-08-22 19:21:44 发布