40 亿QQ号, 1G 内存,怎么去重?

源自 B 乎的讨论贴:https://zhuanlan.zhihu.com/p/875305637

一般来说可能是考察你 BitMap,当然能回答上来 Roaring BitMap 更好。

1. BitMap

优点就是简单高效,内存占用少,时间复杂度为 O(N)

缺点就是依赖于数据的连续性,一般来说就是整型,对于浮点和字符串,显然我们无法将这些数据一一对应到 BitMap 中的某个位置。

然后就是如果数据比较稀疏的话,BitMap 会造成空间浪费。

对于分层类的数据,BitMap 也不太方便,例如一个公司有多个部门,每个部门的人数不同并且差别可能很大,此时我们无法通过一个统一的 BitMap 来解决 hash 问题。

2. 布隆过滤器

相对于 BitMap,布隆过滤器最大的优点就是他不要求数据类型必须是整数

其缺点就是,性能上肯定不如 BitMap,BitMap 对于每个元素只需要 O(1) 时间判断是否存在即可,而布隆多滤器需要多次 hash,每次 hash 的时间复杂度也一般与数据长度有关,也即每次 hash 计算的时间复杂度不一定是 O(1) 的。

并且在空间消耗上,布隆过滤器底层需要一个 map 来作为 hashset,这个 map 一般也是使用布尔数组或位图来实现,在空间上和 BitMap 实际上差不了多少,并且其空间消耗甚至要比 BitMap 更大,因为我们知道,要保证 hash 的效果,也即减少碰撞的概率,hash 容器一般要是数据范围的两倍。

3. Roaring BitMap

Roaring BitMap(压缩位图索引) 可以解决 BitMap 在存储较为稀疏的数据时,空间浪费较多的问题。

参考自:https://cloud.tencent.com/developer/article/1136054

Roaring BitMap 的核心原理就是:

  1. 高位分组
  2. 低位查找

对空间的优化分为两步:

  1. 通过高位分组,每一个高位组合只占用一次空间
  2. 低位根据元素个数使用不同的存储方案:
    1. Array:数据较少时,二分查找,以时间换空间
    2. BitMap:数据较多时

4. 外部归并排序

通过排序实现去重的效率,最大的缺点就是需要多次读取磁盘,IO 消耗比较大。

posted @ 2025-05-26 15:13  光風霽月  阅读(15)  评论(0)    收藏  举报