码迷,mamicode.com
首页 > 其他好文 > 详细

bitmap

时间:2014-08-29 19:52:48      阅读:232      评论:0      收藏:0      [点我收藏+]

标签:strong   ar   问题   代码   sp   时间   on   c   har   

给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)

    

bitmap

标签:strong   ar   问题   代码   sp   时间   on   c   har   

原文地址:http://www.cnblogs.com/johnsblog/p/3945626.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!