问题:
一台主机,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 |

本文介绍了BitMap解决枚举和搜索问题的应用,如字符串全组合枚举、哈米尔顿距离计算,以及在爬虫URL去重和大规模整数去重场景中的作用。同时提到了BitMap在内存有限情况下的高效压缩能力。
最低0.47元/天 解锁文章
2310

被折叠的 条评论
为什么被折叠?



