可以采用位图存储数据,申请一个 bit 类型的数组 bitArr ,每个位置只表示 0 或者 1 状态,可以将占用内存缩小为使用哈希表的 1/32 。
遍历给定的 40 亿个数,遇到数时就将 bitArr 相应位置设置为 1 。
遍历结束后,再遍历 bitArr ,哪个位置上的值是 0 ,那这个数就不在 40 亿个数中。
假如现在只有 10 MB 内存空间可用,就可以考虑使用分块的方法。通过时间换取空间。
将数据平均分成多个区间,只计算区间内的数据,总有一个区间的数是少于其他区间的平均计数的,那就可以从这个区间里用位图的方式找到没出现过的数。
极端情况下这些数可以全部都不相同,那么内存占用会非常大。
使用哈希函数将大文件分为小文件,同一种数是不会被分到不同的小文件上的,就可以得到每个小文件中出现最多的数以及次数统计。
同样使用哈希函数将文件拆分,拆分要注意资源限制,要明确将数据分到若干台机器或者分为若干个文件。
与第一位相同,使用位图,但是这次要用两倍大小的位图解决问题。
用两位表示一个数据,初始为 00 ,每次出现都加一,且加到 11 之后不再变动,这样最后两位为 10 的位置表示的就是出现了两次的数。
如果对您有帮助,请点赞关注支持我,谢谢! ?
如有错误或者不足之处,敬请指正! ?
个人主页:星不易 ?
算法通关村专栏:不易|算法通关村 ?