zoukankan      html  css  js  c++  java
  • 40 亿个 QQ 号码如何去重,bitmap去重

    这是腾讯三面的题:链接 https://blog.csdn.net/dabaoshiwode/article/details/121571610

    具体的题目如下:
    文件中有40亿个QQ号码,请设计算法对QQ号码去重,相同的QQ号码仅保留一个,内存限制1G.

    原题看链接,这里自己理解下bitmap是怎么做到的。前置知识bitmap

    用hashmap去重的话,用int类型2*(2^31-1),负数也算上。

    那么一个int类型32位,4个字节。

    需要  40亿*4/1024/1024/1024 ≈ 14.9G

    这还是不考虑hash冲突最少的情况!

    那么用bitmap的话,用1位表示1个qq号码是否存在

    那么8个位等于1个字节。

    需要  40亿/8/1024/1024/1024 ≈ 0.466G

    只需要不到512MB就可以了!

     如上图:是1个数组上存取了二进制的1个字节的信息。这1个字节的信息可以表示8个qq号码是否存在。时间和空间复杂度都大大降低!

    假如来了一个重复的qq号码12

    1、计算分组 12 / 8 = 1

    2、计算分组下标 12 % 8 = 4

    判断第四位是1,说明12已经有了,|或操作下,自动去重。

    同理用32位的int类型取代上述的8位byte,间隔32个数分组。

    参考文章:

    https://blog.csdn.net/dabaoshiwode/article/details/121571610

    https://zhuanlan.zhihu.com/p/442732557

    https://www.cnblogs.com/cjsblog/p/11613708.html

  • 相关阅读:
    git 命令
    canva 压缩图片
    压缩图片 待验证
    php 多个图片合并为一张
    解析php做推送服务端实现ios消息推送
    php auth认证
    jdk1.8配置
    Tomcat本地服务器配置
    Markdown段落
    Mrkedown语法
  • 原文地址:https://www.cnblogs.com/chenfx/p/15710156.html
Copyright © 2011-2022 走看看