`

bit_map

阅读更多

http://blog.redfox66.com/post/mass-data-4-bitmap.aspx

什么是Bit-map】

所谓的Bit-map就是用一个bit位来标记某个元素对应的Value, 而Key即是该元素。由于采用了Bit为单位来存储数据,因此在存储空间方面,可以大大节省。

如果说了这么多还没明白什么是Bit-map,那么我们来看一个具体的例子,假设我们要对0-7内的5个元素(4,7,2,5,3)排序(这里假设 这些元素没有重复)。那么我们就可以采用Bit-map的方法来达到排序的目的。要表示8个数,我们就只需要8个Bit(1Bytes),首先我们开辟 1Byte的空间,将这些空间的所有Bit位都置为0(如下图:)

image

然后遍历这5个元素,首先第一个元素是4,那么就把4对应的位置为1(可以这样操作 p+(i/8)|(0x01<<(i%8)) 当然了这里的操作涉及到Big-ending和Little-ending的情况,这里默认为Big-ending),因为是从零开始的,所以要把第五位 置为一(如下图):

image

然后再处理第二个元素7,将第八位置为1,,接着再处理第三个元素,一直到最后处理完所有的元素,将相应的位置为1,这时候的内存的Bit位的状态如下:

image

然后我们现在遍历一遍Bit区域,将该位是一的位的编号输出(2,3,4,5,7),这样就达到了排序的目的。下面的代码给出了一个BitMap的用法:排序。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
//定义每个Byte中有8个Bit位
#include <memory.h>
#define BYTESIZE 8
void SetBit( char *p, int posi)
{
     for ( int i=0; i < (posi/BYTESIZE); i++)
     {
         p++;
     }
 
     *p = *p|(0x01<<(posi%BYTESIZE)); //将该Bit位赋值1
     return ;
}
 
void BitMapSortDemo()
{
     //为了简单起见,我们不考虑负数
     int num[] = {3,5,2,10,6,12,8,14,9};
 
     //BufferLen这个值是根据待排序的数据中最大值确定的
     //待排序中的最大值是14,因此只需要2个Bytes(16个Bit)
     //就可以了。
     const int BufferLen = 2;
     char *pBuffer = new char [BufferLen];
 
     //要将所有的Bit位置为0,否则结果不可预知。
     memset(pBuffer,0,BufferLen);
     for ( int i=0;i<9;i++)
     {
         //首先将相应Bit位上置为1
         SetBit(pBuffer,num[i]);
     }
 
     //输出排序结果
     for ( int i=0;i<BufferLen;i++) //每次处理一个字节(Byte)
     {
         for ( int j=0;j<BYTESIZE;j++) //处理该字节中的每个Bit位
         {
             //判断该位上是否是1,进行输出,这里的判断比较笨。
             //首先得到该第j位的掩码(0x01<<j),将内存区中的
             //位和此掩码作与操作。最后判断掩码是否和处理后的
             //结果相同
             if ((*pBuffer&(0x01<<j)) == (0x01<<j))
             {
                 printf( "%d " ,i*BYTESIZE + j);
             }
         }
         pBuffer++;
     }
}
 
int _tmain( int argc, _TCHAR* argv[])
{
     BitMapSortDemo();
     return 0;
}

【适用范围】

可进行数据的快速查找,判重,删除,一般来说数据范围是int的10倍以下

【基本原理及要点】

使用bit数组来表示某些元素是否存在,比如8位电话号码

【扩展】

Bloom filter可以看做是对bit-map的扩展

【问题实例】

1)已知某个文件内包含一些电话号码,每个号码为8位数字,统计不同号码的个数。

8位最多99 999 999,大概需要99m个bit,大概10几m字节的内存即可。 (可以理解为从0-99 999 999的数字,每个数字对应一个Bit位,所以只需要99M个Bit==1.2MBytes,这样,就用了小小的1.2M左右的内存表示了所有的8位数的 电话)

2)2.5亿个整数中找出不重复的整数的个数,内存空间不足以容纳这2.5亿个整数。

将bit-map扩展一下,用2bit表示一个数即可,0表示未出现,1表示出现一次,2表示出现2次及以上,在遍历这些数的时候,如果对应位置的 值是0,则将其置为1;如果是1,将其置为2;如果是2,则保持不变。或者我们不用2bit来进行表示,我们用两个bit-map即可模拟实现这个 2bit-map,都是一样的道理。

分享到:
评论

相关推荐

    C++的pb_ds库在OI中的应用集合

    - **Bit Map Containers**: 如`trie`和`compressed_bit_map`,用于高效地处理位操作和字符串匹配问题。 **3. pb_ds库的优势** - **高效性**: `pb_ds`库的数据结构通常比STL中的实现更高效,尤其在处理大量数据时。...

    four_bit_adder.rar_four

    FA1: full_adder port map (a(1), b(1), temp_cin(0), temp_sum(1), temp_cin(1)); FA2: full_adder port map (a(2), b(2), temp_cin(1), temp_sum(2), temp_cin(2)); FA3: full_adder port map (a(3), b(3), ...

    bit map 苹果手机户外导航

    bitmapBit Map is an offline map viewer for your own topographic or specialised maps... With Bit Map, you can view your own choice of maps, instead of generic maps chosen by somebody else, making it ideal

    python算法数据结构课程视频含代码之位操作1G

    return bool(self.bit_map & (1 &lt;&lt; user_id)) tracker = LoginTracker(10) tracker.set_user_logged_in(3) print(tracker.is_user_logged_in(3)) # 输出 True print(tracker.is_user_logged_in(4)) # 输出 False `...

    MAPAlgorithm.rar_(7_5) convolutional_MAP(5,7)_convolutional code

    This program includes: [5 7] convolutional code (encoder) + BPSK + AWGN + MAP (decoder). It evaluates Bit Error Rate and plots it versus SNR(signal to Noise Ratio).

    软件工程师笔试基础资料整理完整版

    #define IS_BIT_SET(BIT_MAP, x) (((BIT_MAP[x / sizeof(unsigned int)]) &gt;&gt; (x % sizeof(unsigned int))) & (0x1)) ``` 这里的关键在于正确计算出要检测的位在数组中的具体位置和该位置中的具体比特位。需要注意的...

    AC790x开发快速入门-v1.pdf

    gain 的取值范围是 0-100,需要使用该函数 void adc_multiplex_set_gain(const char *source, u8 channel_bit_map, u8 gain);source 取值”mic”或者”linein”。 三、 PWM 配置 PWM(Pulse Width Modulation,...

    十七道海量数据处理面试题与Bit-map详解

    ### 十七道海量数据处理面试题与Bit-map详解 #### 第一部分:十五道海量数据处理面试题 **题目一**:给定a、b两个文件,各存放50亿个URL,每个URL各占64字节,内存限制是4GB,让你找出a、b文件共同的URL。 - **...

    Tiled Map Editor installer for Windows (64-bit)

    Tiled Map Editor installer for Windows (64-bit) 20 MB Version 1.9.2 https://www.mapeditor.org/ Tiled supports editing tile maps in various projections (orthogonal, isometric, hexagonal) and also ...

    用MATLAB编写的图像的金字塔分解

    originalImage = imread('Bit_map.jpg'); % 读取原始图像 pyramid = impyramid(originalImage, 'down', [2 4 8]); % 创建3层向下金字塔,缩放因子分别为2、4、8 ``` 在这个例子中,`'down'`参数表示我们构建的是下...

    inclwdingand.rar_Turbo码 Map算法_Turbo码 SOVA_log-map算法_sova算法_turb

    6. **编码程序**: 包含的其他文件如"0encoderm.m"、"udemultiplex.m"、"rsc_encode.m"、"encode_bit.m"和"6bin_state.m"可能分别实现了Turbo码的零比特插入编码、复用、RSC(Rate-1/2 Recursive Systematic ...

    操作系统课程设计重点.pdf

    - **输出位示图**:调用`bit_map()`函数展示磁盘使用情况。 四、系统实现 系统使用C++语言实现,通过类(如`file`类)封装文件操作,使用文件类和文件库类组织代码,提高可读性和可维护性。主菜单采用用户交互式...

    test_log_map_menu.rar_matlab例程_matlab_

    【标题】"test_log_map_menu.rar_matlab例程_matlab_" 涉及的是一个MATLAB编写的例程,主要用于演示TURBO译码在AWGN(Additive White Gaussian Noise,加性高斯白噪声)信道下的性能测试。这个程序可能包含了一个...

    Android开发之百度地图定位

    &lt;com.baidu.mapapi.map.MapView android:id="@+id/bmapView" android:layout_width="match_parent" android:layout_height="match_parent" /&gt; ``` 在Activity的onCreate方法中: ```java MapView mapView = ...

    百度地图SDK5.2.1

    **正文** 《深入解析百度地图SDK 5.2.1:构建高效Android定位与地图应用》 在移动应用开发领域,地图服务已经成为不可或缺的一部分。百度地图SDK 5.2.1是百度为开发者提供的一款强大的Android平台地图服务工具,它...

    DN资源查看器

    GL_AMD_seamless_cubemap_per_texture GL_AMD_shader_stencil_export GL_AMD_shader_trace GL_AMD_texture_cube_map_array GL_AMD_texture_texture4 GL_AMD_transform_feedback3_lines_triangles GL_AMD_vertex_...

    Tree_bit.rar_tree 图标_visual c++ 树 图标_图标 tree

    标题中的“Tree_bit.rar_tree 图标_visual c++ 树 图标_图标 tree”指的是一个使用Visual C++开发的项目,该项目着重展示了如何在树形控件(Tree Control)前加载自定义图标。树形控件是Windows应用程序中常用的一种...

    RAMMap-32bit.exe

    RAMMap-32bit.exe

    RAMMap-64bit.exe

    RAMMap-64bit.exe

Global site tag (gtag.js) - Google Analytics