您的位置:首页 > 编程语言

第一章 开篇 - 编程珠玑 - 读书笔记

2010-03-06 17:19 232 查看
在朋友的推荐下开始读这本书。读技术类的书有个习惯,先看下目录并决定要精读还是泛读。

感觉不错,值得精读。其中一个不错的方法就是写读书笔记,并坚持每一篇多多少少写一些完整的代码。

比如开篇的问题便是掌握和应用位运算的一个很好的例子。作者巧妙地通过填充位图(位向量)作为整数集合并遍历完成排序的方式达到的时间和空间的双赢。

问题描述如下:

输入:一个最多包含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的实现机制多了点了解。当然文中位图排序思想的形成也不是一带而过的,通过这个双赢的例子,作者得出的结论是——对小问题的仔细分析有进可以得到明显的实际益处。

其实说白了就是具体问题具体分析,还是老毛比较犀利。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: