`
java-mans
  • 浏览: 11448550 次
文章分类
社区版块
存档分类
最新评论

Bit-map

 
阅读更多

本文转自:http://blog.redfox66.com/post/2010/09/26/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(如下图:)

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

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

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

//定义每个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==12.4MBytes,这样,就用了小小的12.4M左右的内存表示了所有的8位数的电话)

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

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

分享到:
评论

相关推荐

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

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

    海量数据处理面试题集锦与Bit-map详解

    方案1:可以估计每个文件安的大小为50G×64=320G,远远大于内存限制的4G。所以不可能将其完全加载到内存中处理。考虑采取分而治之的方法。遍历文件a,对每个url求取,然后根据所取得的值将url分别存储到1000个小文件...

    MIMO-MAP-GPU:MIMO-MAP-GPU是MIMO MAP检测器的开源C ++ CUDA实现

    最大后验MIMO GPU检测器(MIMO-MAP-GPU) MIMO-MAP-GPU是MIMO MAP检测器的开源C ++ / CUDA实现。特征- Multithread C++ MIMO MAP Detector method (MAP-GPU)- Multithread GPU MIMO MAP Detector method (MAP-CPU)- ...

    vc-lod-bit-map-and-display-waveforms.rar_多媒体编程_Visual_C++_

    vc的定时器实现字幕走动和加载位图程序 显示波形

    tiled-windows-64bit-snapshot.zip

    tiled map是一款开源免费的游戏地图编辑开发工具,可以帮助您开发游戏的内容。软件最主要的功能便是编辑游戏中各种形式的瓷砖地图,侧重于一般的灵活性,同时保持直观,并支持图素、层次和对象等通用概念。tiled map...

    Data Sheet S6B33B6X

    driving signal (132 RGB X 132 output) corresponding to the display data and the internal bit-map display RAM of 132 × 132 × 16-bit, S6B33B6X is capable of operating max. 132 RGB x 132 dot LCD ...

    解析bitmap处理海量数据及其实现方法分析

    【什么是Bit-map】 所谓的Bit-map就是用一个bit位来标记某个元素对应的Value, 而Key即是该元素。由于采用了Bit为单位来存储数据,因此在存储空间方面,可以大大节省。 如果说了这么多还没明白什么是Bit-map,那么...

    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

    大数据 海量数据 处理方法总结

    大数据量,海量数据 处理方法总结 包括Bloom filter 哈希 bit-map 堆 双层桶划分 数据库索引 倒排索引 外排序 trie树等。细分为适用范围、要点、实例等。

    关于字符串包含的问题

    4.1、Bit-map 4.2、移位操作 第五节、字符串相关问题扩展 5.1、字符串匹配问题 5.2、在字符串中查找子串 扩展:在一个字符串中找到第一个只出现一次的字符 5.3、字符串转换为整数 5.4、字符串拷贝

    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 ...

    海量数据处理系列之:用C++实现Bitmap算法

    所谓的Bit-map就是用一个bit位来标记某个元素对应的Value, 而Key即是该元素。由于采用了Bit为单位来存储数据,因此在存储空间方面,可以大大节省。 适用范围:可进行数据的快速查找,判重,删除,一般来说数据范围...

    常用算法原理及其代码

    包含Bit-map、堆排序、二分查找、哈希表、快速排序等算法的原理及其C实现代码

    Bit-Force Map Editor:位力地图编辑器。-开源

    Bit-Force地图编辑器是一个免费的地图编辑器,任何人都可以使用它并在其中创建精美的地图!

    论文研究-基于能量表的双簇头无线传感网MAC协议 .pdf

    基于能量表的双簇头无线传感网MAC协议,左超,张宁,无线传感网中节点的低能量特性对MAC协议的设计来说是个巨大的挑战,在众多不同的以分簇为基础的MAC协议中,基于位图辅助(Bit-Map-Assi

    RAMMap-32bit.exe

    RAMMap-32bit.exe

    RAMMap-64bit.exe

    RAMMap-64bit.exe

    Socket Python示例

    getprotobyname() -- map a protocol name (e.g. 'tcp') to a number ntohs(), ntohl() -- convert 16, 32 bit int from network to host byte order htons(), htonl() -- convert 16, 32 bit int from host to ...

Global site tag (gtag.js) - Google Analytics