• 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来表示整数的两种状态,从而大大节省了内存空间。

  • 相关阅读:
    StrUtils单元中的函数
    windows系统字体问题
    进程间通讯(模拟远程CMD)
    sql远程连接SQL(不能打开到主机的连接,在端口 1433:连接失败)
    在delphi中三个形式:ADODB_TLB ADOInt ADODB
    安装Ms SQL Server时提示:以前的某个程序安装已在安装计算机上创建挂起的文件操作。运行安装程序之前必须重新启动计算机。
    从Indy9升级到Indy10时IdTcpServer的变化
    如何实现调用DOS程序的时候的管道输入重定向!
    接口技术
    SysUtils单元函数
  • 原文地址:https://www.cnblogs.com/kyoner/p/11129477.html
Copyright © 2020-2023  润新知