zoukankan      html  css  js  c++  java
  • bitmap

    给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中?

    其实这一题有个问题,如果只要判断一次的话,那就遍历这40亿个数就好了,时间复杂度O(n),没有更快的了。但是如果要判断两个数,三个数,那就要多次遍历所有数,显然是不行的。

    思路:

         对所有数进行一次处理,即bitmap,时间复杂度为O(n),然后每次只要O(1)的时间,就可以判断一个数是否在这40亿个数中。

    bitmap:

         一个Byte(字节)有8bits(位),假设机器是大端的。则:

          地址----> 

          00000000

            高位       低位

        最高位给它序号0,次高位1,依次下去。一个字节有8个序号。unsigned int总共有2^32 = 4G个数,每个数我们都看做是序号的话,则序号4G是4G/8 = 0.5G = 512M的最后一bit。遍历所有数,将每个数看做是序号,申请一个512M的内存,将对应序号的bit置为1。

        然后对给出的数,也当做序号,看该序号的bit是否被置1,就可以判断这个数是否在40亿个数中了。

    注意:

        这里申请内存的时候,我们看的不是40亿个数,而是根据unsiged int总共可能有少个数,一个数对应一个bit。

        大端和小端的bitmap代码是不一样的。

    //大端
    char getI(unsigned int i,char *p) //返回1证明该bit被设置了
    {
        unsigned int index = i/8; //序号i在第几个byte
        unsigned int offset = i%8; //序号i在该byte的第几个bit
        return (*(p+index)>>(7-offset)) & 0x01;
    }
    
    void setI(unsigned int i,char *p)
    {
        unsigned int index = i/8; //序号i在第几个byte
        unsigned int offset = i%8; //序号i在该byte的第几个bit
        *(p+index) |= 0x80>>offset;    
    }
    
    //小端
    char getI(unsigned int i,char *p) //返回1证明该bit被设置了
    {
        unsigned int index = i/8; //序号i在第几个byte
        unsigned int offset = i%8; //序号i在该byte的第几个bit
        return (*(p+index)>>(offset)) & 0x01;
    }
    
    void setI(unsigned int i,char *p)
    {
        unsigned int index = i/8; //序号i在第几个byte
        unsigned int offset = i%8; //序号i在该byte的第几个bit
        *(p+index) |= 0x01<<offset;    
    }

       

        

  • 相关阅读:
    Linux问题分析或解决_samba无法连接
    Android系统编译环境及连接工具配置
    Linux问题分析或解决_ssh无法连接
    新能力| 云开发静态网站托管能力正式上线
    如何在云开发静态托管中使用Hugo
    如何在云开发静态托管绑定静态域名
    3步搞定图像盲水印?试试云开发扩展能力
    不再忍受龟速 Github,你也可以试试在云开发上部署个人博客!
    云开发 For Web:一站式开发下一代 Serverless Web 应用
    下笔如有神的程序员来教你写作啦!
  • 原文地址:https://www.cnblogs.com/johnsblog/p/3945626.html
Copyright © 2011-2022 走看看