感觉还是得要有本纸质的书本,看了一下评价,都说翻译太烂了。
果断要了本E文版的,读起来有点吃力。六级果然也就是浮云。
感觉自己实力真是有限,所以忍不住想说明一下:这纯属个人读书笔记,偶尔看到我的笔记的朋友,如果有意见欢迎提出、指正,不过请注意用语。
进度有点慢,所以本章的三个问题还是一个一个来吧。
问题:给定一个包含了40亿个32位整数的顺序文件且整数的次序是随机的。请找出一个文件中没有出现的32位整数(至少能找出一个,Why?)。在主存足够的情况下你会怎么做?如果你可以使用若干外部临时文件但是主存只有几百字节,你又会怎么做?
第一反应,我想起了小学时候碰到的一道智力题:一堆(100个)从外观上无法区分的硬币(玻璃弹珠.....),其中有一个假币,特征是重量比真币要轻,可用道具——天平,至少称量几次能找出假币。相信各位看官都已有了答案。其实就是利用二分法原理。
二分法效率很高,探测次数不会超过log2n,在处理海量数据时表现很好。所以使用本题。但是很多二分查找的程序很难写。对于我,用程序实现此题的解,我现在还做不到,因为对于处理文件经验不足,老是感觉有点障碍。不过可以先分析、理解一下算法。
首先考虑主存足够的情况,回顾前一章,正是,可以使用位图。32位的整数有多少个呢?2的32次,也就是4,294,967,296个(文件中是40亿个,所以只要你认真去找一定能找到文件中遗漏的数),那么就需要536,870,912 个8位(书中的写法)分配给一个位图来表示所有的数。对于作者的这表示让我好好的想了想,为什么不是268,435,456个16位,不是134,217,728个32位。而后面突然反应过来,这样表示可以一样看出这位图将占用536M的内存。536M确实可以说很耗内存了。在我的经验中,Myeclipse会占到100~200M,PS会占到200M+,Opera在开很多选项卡的时候会到400M+,Pl/Sql在数据量到千万以上时会占到500M+,这时我这机器开始卡了。
现在考虑问题中所说的只有几百字节,书中给的算法:在包含至少一个遗漏元素的范围中
read number line from file
IF number < midpoint
write number into lower file
ELSE
write number into upper file
这样一来元素较少的那一半一定是包含了遗漏的元素(数字)。如此递归下去,终能找出那个“元凶”。
这些天为了维护一个程序,折腾得有点疲了,今天就到这吧。
当然,还得记住,还欠一个代码实现。