zoukankan      html  css  js  c++  java
  • bitmap-如何判断某个整数是否存在40亿个整数中?

    有这样一道面试题:现有40亿个整数,如果再给定一个新的整数,怎么判断这个整数是否在这40亿个整数中?

    你可能首先会想到用一个set存储,那个新数只需判断是否在set中。但是如果用set存储的话,如果一个整数4个字节,40亿个的话就是160亿个字节,大概是16GB。这需要的内存就非常大了。

    那么如果现在把内存限制在2GB,你会怎么做?

    对于这次问题你可能会首先想到把这40亿个数据分8次加载,这样每次加载的数据就可以把内存限制在2GB。

    但是如果这样做的话,会非常慢。从磁盘加载数据是非常慢的,比内存中的操作慢数百倍,你每次都要加载这么大的数据,还要8次,这个时间甚至可以达到小时级别了。

    其实可以用8台机器进行操作。可以运用分布式的算法思想,把数据分散到8台机器上,每台机器分别计算,然后来一个新的数据,8台机器一起找,最后再将结果进行汇总就可以了。

    这样,每台机器都可以一次性把数据读入内存,在比较的时候就不用来回加载数据了,所以可以节省加载数据的开销。

    当然,这并不是最好的方法,还有一种方法可以达到毫秒级别的。

    判断一个数存不存在,其实只要两个状态,可以用一个位来代表。

    1代表第一个位,2代表第二个位,2的32次方代表最后一个位。所以就应该申请2的32次方个位,也就是43亿个位多点。40亿个数中,存在的数在相应的位置为1,其它位就是0。

    如果新来了一个数,该数就去找相应的位,比如来了个1234,就去找第1234位,如果是1就存在,0就代表不存在。

    在来分析下内存空间,2的32次方个位,就是2的29次方个字节,就相当于500MB,节省了相当多的内存。

    因为原来的32位整数,转化为了1位的空间,所以数据空间就是原来的32分之一了。

    其实这就是大数据领域非常有名的位图,即bitmap算法。顾名思义,就是用位来代表一个数字,每一位的0或1来表示整数的两种状态,从而大大节省了内存空间。

  • 相关阅读:
    QA问答系统,QA匹配论文学习笔记
    HMM Viterbi算法 详解
    py2 to py3 return iterator
    git 的回退
    mysql之group_concat函数详解
    sqlserver系统表使用
    Spring事务配置的五种方式
    MySQL 触发器简单实例
    64位Java开发平台的选择,如何区分JDK,Tomcat,eclipse的32位与64版本
    HSSFWorkbook和XSSFWorkbook的区别
  • 原文地址:https://www.cnblogs.com/kyoner/p/11129477.html
Copyright © 2011-2022 走看看