第一章 开篇 - 编程珠玑 - 读书笔记
2010-03-06 17:19
232 查看
在朋友的推荐下开始读这本书。读技术类的书有个习惯,先看下目录并决定要精读还是泛读。
感觉不错,值得精读。其中一个不错的方法就是写读书笔记,并坚持每一篇多多少少写一些完整的代码。
比如开篇的问题便是掌握和应用位运算的一个很好的例子。作者巧妙地通过填充位图(位向量)作为整数集合并遍历完成排序的方式达到的时间和空间的双赢。
问题描述如下:
输入:一个最多包含n个正整数的文件,每个数都小于n,其中n=107。如果在输入文件中有任何整数重复出现就是致命错误。没有其他数据与该整数相关联。
输出:按升序排列的输入整数的列表。
约束:最多有(大约)1 MB的内存空间可用,有充足的磁盘存储空间可用。运行时间最多几分钟,运行时间为10秒就不需要进一步优化了。
还没来得及往后看,我便用C++的bitset写了一下代码:
注释部分是我去翻了SL里bitset的源文件后得出的结论,往下则看到了作者在习题2中直接使用逻辑与或移位等运算实现位向量。代码可以说是短小精悍:
与bitset实现机制一样,作者也是以32位整形数为单位进行位图(位向量)填充的底层操作的。
总之,读了第一章后对逻辑运算的使用及bitset的实现机制多了点了解。当然文中位图排序思想的形成也不是一带而过的,通过这个双赢的例子,作者得出的结论是——对小问题的仔细分析有进可以得到明显的实际益处。
其实说白了就是具体问题具体分析,还是老毛比较犀利。
感觉不错,值得精读。其中一个不错的方法就是写读书笔记,并坚持每一篇多多少少写一些完整的代码。
比如开篇的问题便是掌握和应用位运算的一个很好的例子。作者巧妙地通过填充位图(位向量)作为整数集合并遍历完成排序的方式达到的时间和空间的双赢。
问题描述如下:
输入:一个最多包含n个正整数的文件,每个数都小于n,其中n=107。如果在输入文件中有任何整数重复出现就是致命错误。没有其他数据与该整数相关联。
输出:按升序排列的输入整数的列表。
约束:最多有(大约)1 MB的内存空间可用,有充足的磁盘存储空间可用。运行时间最多几分钟,运行时间为10秒就不需要进一步优化了。
还没来得及往后看,我便用C++的bitset写了一下代码:
/************* 位图排序算法实现 *************/ #include <iostream> #include <bitset> #include <fstream> using namespace std; int main() { // 查看bitset的实现可知bitset是利用对unsigned long进行位运算间接实现对位的存储的 // 如是保存一个32位的bitset实质是保存了4个unsigned long长整数 bitset<1000000> b; b.reset(); ifstream in("before_sort.txt"); ofstream out("after_sort.txt"); int i; while (!in.eof()) { in>>i; b.set(i); } for (i=0;i<1000000;++i) { if (b[i]==1) { out<<i<<endl; } } return 0; }
注释部分是我去翻了SL里bitset的源文件后得出的结论,往下则看到了作者在习题2中直接使用逻辑与或移位等运算实现位向量。代码可以说是短小精悍:
/******************** 作者的代码Chapter1_Ex2 ********************/ #define BITSPERWORD 32 #define SHIFT 5 #define MASK 0x1F #define N 10000000 int a[1+N/BITSPERWORD]; void set(int i) {a[i>>SHIFT]|=(1<<(i&MASK));} void clr(int i) {a[i>>SHIFT]&=~(1<<(i&MASK));} int test(int i) {return a[i>>SHIFT]&(1<<(i&MASK));}
与bitset实现机制一样,作者也是以32位整形数为单位进行位图(位向量)填充的底层操作的。
总之,读了第一章后对逻辑运算的使用及bitset的实现机制多了点了解。当然文中位图排序思想的形成也不是一带而过的,通过这个双赢的例子,作者得出的结论是——对小问题的仔细分析有进可以得到明显的实际益处。
其实说白了就是具体问题具体分析,还是老毛比较犀利。
相关文章推荐
- 【编程珠玑】读书笔记 第一章 开篇
- 【编程珠玑】第一章:开篇
- 编程珠玑之第一章:开篇(习题)泛览
- 【编程珠玑】第一章 开篇
- 【编程珠玑】第一章 开篇
- 编程珠玑 第一章 开篇
- 【编程珠玑】第一章 开篇
- 【编程珠玑】读书笔记 第三章 数据决定程序结构
- 【编程珠玑】读书笔记 第十二章 取样问题
- 对一千万条数据进行排序---编程珠玑第二版 第一章
- 编程珠玑 第一章
- 编程珠玑---第一章 阅读笔记
- 编程珠玑之第一章习题5:两趟算法完成100w数据排序
- 多核处理器时,__rdtsc()的使用-编程珠玑第一章
- 【编程珠玑】读书笔记 时空开销模型
- 读书笔记 ASP.NET 2.0编程珠玑
- 【编程珠玑】读书笔记 第五章 编程小事
- Book-编程珠玑-第一章
- 读书笔记-UNIX系统编程第一章
- 【读书笔记】C#高级编程 第一章