编程珠玑|读书笔记

  • 给定40亿个随机排列的32位整数的顺序文件,找出一个不在文件中的整数

首先先估算大小:

一个32位整数4bytes

40亿则是4*4.000.000.000bytes = 15625000KB ~= 15258MB ~= 15GB

如果采用bitmap还可以降低为2GB左右的内存

显然,现在随便一台高级点的计算机可以达到此内存级别,那么内存充足的情况下,直接对这个文件做map,然后顺序遍历一遍,空间复杂度为O(n),时间复杂度为O(n)

在内存不足情况下,但是有额外的外存空间,我们做归并排序,然后遍历,时间复杂度为O(n+nlogn)

还有一种做法是标准的二分查找:

我们给定一个分割标准(这里用整数的范围做标准),使得40亿个整数能够均匀的分布在两个文件

然后找到哪部分的文件不够20亿个,重复上一步骤直到整数范围上限和下限相同,则此时上限=下限=缺失的文件

  • 给定一个英语词典,找出其中所有变位词集合

我们为每一个英文字母映射成一个素数,遍历字典,找出英文字母对应的素数乘积值一样的,即是变位词。

这个正确性由算术基本定理保证