今天花了一下午的时间,才看完了《编程珠玑》——Programming Pearls,Jon Bentley——————的第一章,开篇,囧。荒废了很多时光,现在努力也不晚,就说说今天下午看开篇的心得吧。
这本书真的是相当不错,仅仅是一个开篇,就让我的眼界开阔了许多。开篇提出的一个实际问题是:如何在只有1MB左右内存的情况下,实现对一个有1000万个7位不重复整数的文件的排序。这本书的分析过程也很精妙,从简单的使用系统外部排序,再深入的分析了数据大小,得出了读取40遍文件,分批的对纪录进行排序的方法。
最后作者使用的解决方式是,用位示图法,用1000万个bit(约1.25MB)表示1000万个整数的集合,从而在只有1MB的内存情况下解决了这个问题,排序时间只有1s左右,整个操作只有10s左右。Excellent! 这本书最好的地方在于它的习题,可以指引着你将这个问题不断发散,发散,引出其他非常多的知识与非常精妙的算法和程序。以本章第二题来说,它问:如何使用与,或,移位操作完成对位字符串的操作。 答案中的程序不到10行,本人愚钝,用了30分钟才弄懂程序,又用了15分钟才明白其中精妙,而写出这样的程序,还路漫漫其修远兮。 2012.2.21
程序如下: C语言描述
#define N 10000000
#define BITPERWORD 32
#define MASK 5
int a[1+N/BITPERWORD];
int test(int i){ return a[i>>SHIFT] & (1<<(i&MASK)); }
void clr(int i){ a[i>>SHIFT] &= ~(1<<(i & MASK));}
void set(int i){ a[i>>SHIFT] |= 1 << (i & MASK);}