- 给定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亿个,重复上一步骤直到整数范围上限和下限相同,则此时上限=下限=缺失的文件
- 给定一个英语词典,找出其中所有变位词集合
我们为每一个英文字母映射成一个素数,遍历字典,找出英文字母对应的素数乘积值一样的,即是变位词。
这个正确性由算术基本定理保证