Bit-map算法实现

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

1. Bit-map应用

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

2)去重数据而达到压缩数据

2. Bit-map算法评价

优点:

1. 运算效率高,不进行比较和移位;

2. 占用内存少,比如最大的数MAX=10000000;只需占用内存为MAX/8=1250000Byte=1.25M。

缺点:

1. 所有的数据不能重复,即不可对重复的数据进行排序。(少量重复数据查找还是可以的,用2-bitmap)。

2. 当数据类似(1,1000,10万)只有3个数据的时候,用bitmap时间复杂度和空间复杂度相当大,只有当数据比较密集时才有优势。

3. Bit-map算法示例

3.1 只需要1个8bit空间的例子

假设要对0-7内的5个元素(4,7,2,5,3)排序(这里假设这些元素没有重复)。那么就可以采用Bit-map的方法来达到排序的目的。

用8个Bit(1Bytes)来表示0-7内的8个数,并将这些空间的所有Bit位都置为0(如下图):

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

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

最后遍历一遍Bit区域,将位置是1的对应的编号输出(2,3,4,5,7),这样就达到了排序的目的。

3.2 需要多个8bit空间的例子

假设需要排序或者查找的最大数MAX=10000000(这里MAX应该是最大的数而不是int数据的总数!),那么我们需要申请内存空间的大小为int a[1 + MAX/32],在内存中int占4个字节共32位。其中:a[0]在内存中占32为可以对应十进制数0-31,依次类推:

bitmap表为:

a[0]--------->0-31

a[1]--------->32-63

a[2]--------->64-95

a[3]--------->96-127

..........

要把一个整数N映射到Bit-Map中去,首先要确定把这个N Mapping到哪一个数组元素中去,即确定映射元素的index。我们用int类型的数组作为map的元素,这样我们就知道了一个元素能够表示的数字个数(这里是32)。于是N/32就可以知道我们需要映射的key了。所以余下来的那个N%32就是要映射到的位数。比如:N=65,65/32=2(-->对应在数组a中的下标为1,a[1]),65%32=1(--> 对应0-31的第1位),那么65的位置应该在a[1]的0-31中的第1位置。

4. 移位操作的实现

4.1 移位实现:求十进制数对应在数组a中的下标i

i = n>>K 等同于 n/(2^K)

int型数组,数组的每个元素都是int,int需要32bit的空间。所以先由十进制数n转换为与32的余可转化为对应在数组a中的下标。如十进制数0-31,都应该对应在a[0]中,比如n=24,那么 n/32=0,则24对应在数组a中的下标为0。又比如n=60,那么n/32=1,则60对应在数组a中的下标为1,同理可以计算0-N在数组a中的下标。

如果要求n在int型数组中的下标,那么就需要n/32,所以上面公式K=5。

Note: map的范围是[0, 原数组最大的数对应的2的整次方数-1]。

4.2 移位实现:求十进制数在数组元素a[i]中0-31的位置m

m = n & ((1 << K) - 1) 等同于 n%(2^K)

十进制数0-31就对应0-31,而32-63则对应也是0-31,即给定一个数n可以通过模32求得对应0-31中的数。如果要求n在a[i]中的0-31的具体位置,那么就需要n%32,所以上面公式K=5。

4.3 移位实现:设置int型a[i]的0-31中第m位的bit位为1

a[i] = a[i] | (1<<m)

利用移位0-31使得对应第m个bit位为1。如:将当前4对应的bit位置1的话,只需要1左移4位与B[0] | 即可。

Note:  1  p+(i/8)|(1<<(i%8))这样也可以?

4.4 移位实现:设置int型a[i]的0-31中第k位的bit位为0

a[i] = a[i] & ~(1<<k)

5. Bit-map算法代码实现

原文地址:https://www.cnblogs.com/zldmy/p/11565991.html

时间: 2024-11-11 07:46:35

Bit-map算法实现的相关文章

海量数据处理算法—Bit-Map

原文:http://blog.csdn.net/hguisu/article/details/7880288 1. Bit Map算法简介 来自于<编程珠玑>.所谓的Bit-map就是用一个bit位来标记某个元素对应的Value, 而Key即是该元素.由于采用了Bit为单位来存储数据,因此在存储空间方面,可以大大节省. 2. Bit Map的基本思想 我们先来看一个具体的例子,假设我们要对0-7内的5个元素(4,7,2,5,3)排序(这里假设这些元素没有重复).那么我们就可以采用Bit-map

体绘制(Volume Rendering)概述之3:光线投射算法(Ray Casting)原理和注意要点(强烈推荐呀,讲的很好)

转自:http://blog.csdn.net/liu_lin_xm/article/details/4850609 摘抄“GPU Programming And Cg Language Primer 1rd Edition” 中文 名“GPU编程与CG语言之阳春白雪下里巴人” 15.1 光线投射算法原理 光线投射方法是基于图像序列的直接体绘制算法.从图像的每一个像素,沿固定方向(通常是视线方向)发射一条光线,光线穿越整个图像序列,并在这个过程中,对图像序列进行采样获取颜色信息,同时依据光线吸收

MyBatis无限级分类实现的两种方法--自关联与map集合

1.这回先创建数据库吧 下表cid是CategoryId的缩写,cname是CategoryName的缩写,pid是parentId的缩写 无限级分类一般都包含这三个属性,至少也要包含cid和pid才能建立无限级关联 ok,这个东东就是无限级分类了. 即便是外行人稍微看一眼也能发现cid为1的图书在小说和周刊两行中作为了pid,也就是说小说和周刊的父级分类就是图书 图书和饮料的pid是0,代表他们是顶级分类 如果没有其他约束条件,这张表几乎可以无限向下级延伸,是一个树形结构,这里就不写什么数学公

《CSM and PCF》

在进行阴影绘制的时候,除了blur整张shadow map之外,实现软阴影的方法还有CSM和PCF. CSM(Cascaded Shadow Map)即级联shadow map,它的做法是把相机从近裁剪面到远裁剪面分割成N个子视锥,每个视锥渲染一张shadow map. 一般而言,级联shadow map的几级大小是一样的,比如四级,可以在整张shadow map中分成四份,只是一级的shadow map里面的可视区域最小,阴影边缘锯齿也最不明显:第四级的shadow map可视区域最大,用它做

集合框架学习笔记

集合框架由来 Java2之前,Java是没有完整的集合框架的.它只有一些简单的可以自扩容的容器类,比如 Vector,Stack,Hashtable等 为什么存在容器(可以存储多个数据) 数组的弊端: 1,长度是不可变的,一旦数组初始化之后,长度是固定的 2,在N个地方需要存储多个数据,都得专门写数组的操作方法,代码和功能重复 3,数组定义方法参差不齐集合框架:是为表示和操作集合而规定的一种统一的标准的体系结构.任何集合框架都包含三大块内容:对外的接口,接口的实现和对集合运算的算法为什么需要集合

机器人学 —— 机器人感知(Mapping)

对于移动机器人来说,最吸引人的莫过于SLAM,堪称Moving Robot 皇冠上的明珠.Perception 服务于 SLAM,Motion Plan基于SLAM.SLAM在移动机器人整个问题框架中,起着最为核心的作用.为了专注于Mapping,此章我们假设 Location 是已知的. 1.Metric Map 轨迹规划任务是再Metric Map的基础上完成的.当然,层次最高的是语意图,语意图是未来研究的热点方向.获取Metric Map 的难度最大之处在于:1.传感器噪声(May be

说话人自适应技术

说话人自适应技术 (Speaker Adaptation ,SA):非特定人 (Speaker Independent ,SI):特定人 (Speaker Dependent ,SD) 『SA+SI』 自适应凡是分类:批处理式.在线式.立即式 | 监督 无监督 自适应经典算法:基于最大后验概率 (Maximum a posteriori ,MAP) 的算法.基于变换的算法『Tip : 先学习SI语音识别技术』 基于最大后验概率 (Maximum a posteriori ,MAP)算法 基本MA

002 bitmap海量数据的快速查找和去重

题目描述 给你一个文件,里面包含40亿个整数,写一个算法找出该文件中不包含的一个整数, 假设你有1GB内存可用. 如果你只有10MB的内存呢? 对于40亿个整数,如果直接用int数组来表示的大约要用40*10^8*4B=16GB,超出了内存要求,这里 我们可以用bitmap来解决,bitmap基本思想是一位表示一个整数,比如我们有6个数据: 7   3  1  5  6  4 假设bitmap容量为8,当插入7时 bit[7]=1,一次类推 bit[3]=1 bit[1]=1 bit[5]=1

Photoshop中磁力套索的一种简陋实现(Python)

经常用Photoshop的人应该熟悉磁力套索(Magnetic Lasso)这个功能,就是人为引导下的抠图辅助工具.在研发领域一般不这么叫,通常管这种边缘提取的办法叫Intelligent Scissors或者Livewire. 本来是给一个图像分割项目算法评估时的Python框架,觉得有点意思,就稍稍拓展了一下,用PyQt加了个壳,在非常简陋的程度上模拟了一下的磁力套索功能.为什么简陋:1) 只实现了最基本的边缘查找.路径冷却,动态训练,鼠标位置修正都没有,更别提曲线闭合,抠图,Alpha M

gibbs采样

gibbs采样 关键字一 关键字二 参数估计与预测 机器学习的一般思路为: 1.从问题的本质中构建模型,定义样本的产生,有联合概率(图模型). 2.进行模型参数的估计:MLE.MAP.Bayes. 3.使用模型对新样本进行估计. MLE:极大似然估计 估计:解优化函数 预测: MAP:极大后验估计 估计:解优化函数 预测: 对比极大似然估计,引入了关于的先验知识. Bayes估计 估计:后验概率 预测: 对于MLE和MAP算法,对模型参数进行点估计,没有考虑未知样本导致的模型参数的不确定性:对于