问题:
一台主机,2G内存,40亿个不重复的没排过序的unsigned int的整数的文件,然后再给一个整数,如何快速判断这个整数是否在那40亿个数当中?
解决法案:
遍历法
如果内存足够将40亿个数全部放到内存中,逐个遍历,此时时间复杂度为O(N).可是现在在内存不足,需要批量读一部分数据到内存然后在做判断,加上I/O操作的时间,时间复杂度远远大于O(N).
这时,性能问题主要集中在I/O操作,和遍历数组上。那么有没有降低时间复杂度的方法呢?答案是肯定的,如果我们假定内存是足够的,只去优化时间,可以得到下面的方法。
直接寻址表法
申请一个4G超大数组char a[0~2*32-1],将文件中出现的数字置为1,没有出现的置为0.
例如文件存在一个整数1000022,就将a[1000022]=1.
a | 0 | 1 | <