美文网首页
算法 - BitMap

算法 - BitMap

作者: googoler | 来源:发表于2020-05-15 09:39 被阅读0次

基本思想:

  • 所谓的BitMap就是用一个bit位来标记某个元素所对应的value,而key即是该元素,由于BitMap使用了bit位来存储数据,因此可以大大节省存储空间;用于对大量整形数据做去重和查询。

原理

这此我用一个简单的例子来详细介绍BitMap算法的原理。假设我们要对0-7内的5个元素(4,7,2,5,3)进行排序(这里假设元素没有重复)。我们可以使用BitMap算法达到排序目的。要表示8个数,我们需要8个byte。

  1. 首先我们开辟一个字节(8byte)的空间,将这些空间的所有的byte位都设置为0
  2. 然后便利这5个元素,第一个元素是4,因为下边从0开始,因此我们把第五个字节的值设置为 1
  3. 然后再处理剩下的四个元素,最终8个字节的状态如下图:


    image.png
  4. 现在我们遍历一次bytes区域,把值为1的byte的位置输出(2,3,4,5,7),这样便达到了排序的目的

从上面的例子我们可以看出,BitMap算法的思想还是比较简单的,关键的问题是如何确定10进制的数到2进制的映射图。
MAP映射:
  假设需要排序或则查找的数的总数N=100000000,BitMap中1bit代表一个数字,1个int = 4Bytes = 4*8bit = 32 bit,那么N个数需要N/32 int空间。所以我们需要申请内存空间的大小为int a[1 + N/32],其中:a[0]在内存中占32为可以对应十进制数0-31,依次类推:

a[0]-----------------------------> 0-31
a[1]------------------------------> 32-63
a[2]-------------------------------> 64-95
a[3]--------------------------------> 96-127
......................................................

那么十进制数如何转换为对应的bit位,下面介绍用位移将十进制数转换为对应的bit位:

  1. 求十进制数在对应数组a中的下标
    十进制数0-31,对应在数组a[0]中,32-63对应在数组a[1]中,64-95对应在数组a[2]中………,使用数学归纳分析得出结论:对于一个十进制数n,其在数组a中的下标为:a[n/32]
  2. 求出十进制数在对应数a[i]中的下标
    例如十进制数1在a[0]的下标为1,十进制数31在a[0]中下标为31,十进制数32在a[1]中下标为0。 在十进制0-31就对应0-31,而32-63则对应也是0-31,即给定一个数n可以通过模32求得在对应数组a[i]中的下标。
  3. 位移
  • 对于一个十进制数n,对应在数组a[n/32][n%32]中,但数组a毕竟不是一个二维数组,我们通过移位操作实现置1
    a[n/32] |= 1 << n % 32
  • 移位操作:
    a[n>>5] |= 1 << (n & 0x1F)
    n & 0x1F 保留n的后五位 相当于 n % 32 求十进制数在数组a[i]中的下标

参考:

相关文章

  • 算法:BitMap

    BitMap 算法 引导 如果我们现在有一堆数据,[0 ,3 ,4 ,7 ,9 ,1 ,2 ,5 ,6 ,8 ,2...

  • 算法 - BitMap

    基本思想: 所谓的BitMap就是用一个bit位来标记某个元素所对应的value,而key即是该元素,由于BitM...

  • bitmap算法

    所谓bitmap算法就是,用一个bit来标记,当前元素是否或者存在这个标签。是标签和另外一个维度的映射关系。比如1...

  • 【算法与数据结构专场】BitMap算法基本操作代码实现

    上篇我们讲了BitMap是如何对数据进行存储的,没看过的可以看一下【算法与数据结构专场】BitMap算法介绍 这篇...

  • BitMap&布隆过滤器

    一.BitMap BitMap算法流程 假设需要排序或者查找的最大数MAX=10000000(lz:这里MAX应该...

  • No.14 【大数据算法】BitMap的原理和实现

    0x00 前言 本篇是大数据算法系列 第一篇《BitMap的原理和实现》,BitMap 的思想的和原理是很多算法的...

  • iOS图形学(二):bitmap位图详解

    位图算法 概念:所谓的 BitMap 算法就是用一个 bit 位来标记某个元素所对应的 value; 举例:现有 ...

  • 布隆过滤器

    什么是布隆过滤器 布隆过滤器(Bloom Filter) 是一种以Bitmap为基础的排重算法。由Bitmap和一...

  • 直观理解:bitmap算法

      bitmap严格意义上来说不是一种算法,而是一种使用bit位进行数据存储表示的数据结构。通常当我们遇到需要对海...

  • 排序和查找算法-Bitmap算法

    偶然看到Bitmap算法,利用闲暇时间仔细深入研究一番,这里谈谈我的感悟。 一、算法思想 在日常编程过程中,我们熟...

网友评论

      本文标题:算法 - BitMap

      本文链接:https://www.haomeiwen.com/subject/bfpqohtx.html