转自:http://blog.csdn.net/xgdofull/article/details/5424611

简单的说就是用数组存放若有数据就标志为1或true,若不存在标志为0或false。比如1,2,2,5,这里最大值为5,0至5中不存0,3,4,所以:

Array[0]=0,Array[1]=1,Array[2]=2,Array[3]=0,Array[4]=0,Array[5]=1

上面数中由于2有两个,所以用int存数组的值,不用boolean型,这样如果有多个同样的数字可以用值表示个数。如上面Array[2]=2,就表示2有2个。

这样排序就方便多了,比如上面开始是{2,5,2,1}这样一无序数组A。找出最大值:5.即用来作位图排序的数组B要申请的大小为5.循环这个数组,把数组A的值用作数组B的下标,如果存在就把值加1,即数组B的值为对应的个数。

for (int i : A) {

B[i]++;

}

这样B的值最后同上面的Array一样。把B值大于0的输出就是排好序的了。如上面的数组大于0依次有:1,2,2,5.

从上面可以看出位图排序至少要注意两点:

1、  最大值和最小值之间不能相差太大,否则浪费空间。

2、  如果有负数,上面要转换一下,最申请的空间大小为max-min+1,数组B的下标也要作对应的转换,输出前也要转换回去。如int[] arr = { 1, 3, -3, 0, 0};

位图排序算法如下:

/**

*使用位图法进行排序

*

*@paramarr

*/

publicstaticvoid bitmapSort(int[] arr) {

// 找出数组中最值

int max = arr[0];

int min = max;

for (int i : arr) {

if (max < i) {

max = i;

}

if (min > i) {

min = i;

}

}

// 得到位图数组

int[] newArr = newint[max - min + 1];

// 重新调整arr中的元素

int index = 0;

for (int i = 0; i < newArr.length; i++) {

while (newArr[i] > 0) {

arr[index] = i + min;

index++;

newArr[i]--;

}

}

}

延伸:

checkbox中有多个值时,为了节约数据空间,我们可以用2^n(n>=0)的值来作为value的值。比如有4个选项A,B,C,D。value分别为1,2,4,8。假如用户选了AC,那么数据库存的就是1+4=5,这样一个5就表示了用户选中的是A,C。取出是用5 分别与上面的1,2,4,8与运算不为0即表示用户选中过。

如5(0101)

A(0001)

--------------

0001-->!=0 表示用户选中A

如5(0101)

B(0010)

--------------

0000-->==0 表示用户没用选中B

其他两项同理。

思考:题目描述:

输入:一个文件,里面大约有1千万行数据,每个数据是7位整数,同时每个数是唯一的,即不允许有2个数相同,这些整数不与其他任何数产生关联。

输出:将这个整数按升序排列,并生成到一文件中

限制:能够使用内存为1M,但是附存足够大,运行时间最多为几分钟,10s为最合适的时间。

可能的算法:

1.基于磁盘的合并排序

2 将每个号码存放到32位整数里,1M空间可以存储250000个号码,使用一个在输入文件中带有40个通道的程序。第一个通道将0-249999之间的任意整数读入内存 进行排序,依次类推 第40个通道排序9750000-9999999。快排不错。但是付出了读40次程序的代价。

3 最适合的算法,位图算法,用含有1千万个位的字符串来表示这个文件,文件中有的数据则标识为1,没有则标识为0,最后从第一位读至最后一位,即为有序的集合。这种算法充分利用了题目中给的条件,但也仅仅适合本题目,(不会有重复的数字,同时不与其余的数进行关联)

Bitmap介绍的更多相关文章

  1. 大数据下的Distinct Count(二):Bitmap篇

    在前一篇中介绍了使用API做Distinct Count,但是精确计算的API都较慢,那有没有能更快的优化解决方案呢? 1. Bitmap介绍 <编程珠玑>上是这样介绍bitmap的: B ...

  2. Bitmap

    Bitmap篇   在前一篇中介绍了使用API做Distinct Count,但是计算精确结果的API都较慢,那有没有能更快的优化解决方案呢? 1. Bitmap介绍 <编程珠玑>上是这样 ...

  3. 简化布隆过滤器——BitMap

    简化布隆过滤器--BitMap 前言 前段开发项目试就发现,一部分的代码实现存在着一些性能上的隐患.但当时忙于赶进度和由于卡发中的不稳定因素,想了许多解决方案也没有机会实施.最近,正好趁个机会进行一系 ...

  4. BitMap与RoaringBitmap、JavaEWAH

    本文主要介绍BitMap的算法思想,以及开源工具类JavaEWAH.RoaringBitmap的简单用法. 一.BitMap 介绍 BitMap使用bit位,来标记元素对应的Value.该算法能够节省 ...

  5. Redis系列8:Bitmap实现亿万级数据计算

    Redis系列1:深刻理解高性能Redis的本质 Redis系列2:数据持久化提高可用性 Redis系列3:高可用之主从架构 Redis系列4:高可用之Sentinel(哨兵模式) Redis系列5: ...

  6. Android 2D绘图初步

    Android是通过graphics类来显示2D图形的.其中graphics中包括了Canvas.Paint.Color.Bitmap等类.graphics具有绘制点.线.颜色.2D几何图形.图像处理 ...

  7. 14.Android UiAutomator 图像处理

    一.BitMap介绍 1.图像使用场景 1)效果类截图 2)不可见的组件图像对比 3)失败与异常截图 4)利用图像判断组件 2.部分API简单说明 API 说明 compress 压缩图片 copy ...

  8. QEMU/KVM磁盘在线备份

    QEMU/KVM磁盘的在线完整及增量备份,是"打包"方案的一种具体实现,可实现基于时间点的备份,同时支持本地与远程2种备份方式,并可指定备份文件进行恢复. tag: qemu, k ...

  9. 2 万字 + 20张图| 细说 Redis 九种数据类型和应用场景

    作者:小林coding 计算机八股文网(操作系统.计算机网络.计算机组成.MySQL.Redis):https://xiaolincoding.com 大家好,我是小林. 我们都知道 Redis 提供 ...

随机推荐

  1. centos 6.6编译安装nginx--来自阿里云帮助文档

    刚开始接触运维工作, 需要安装nginx,就在网上找了各种的方法, 结果都是大家抄来抄去,都不好用. 由于公司用的是阿里云的服务器, 所以在阿里云上找到了安装nginx的方法,现在摘抄下来,供大家借鉴 ...

  2. js监听用户的键盘敲击事件,兼容各大主流浏览器

    js监听用户的键盘敲击事件,兼容各大主流浏览器 <script type="text/javascript"> document.onkeydown = functio ...

  3. oracle分组查询

    分组函数 在分组函数中,如果有一个查找项分组,其他项必须也分组,比如下面的语句会报错,因为sal分组了,而ename没有分组: 1.显示工资最高的员工: 2.显示所有员工的平均工资: 2.1使用系统函 ...

  4. GUI编程笔记(java)06:GUI窗体添加按钮并对按钮添加事件案例

    1.需求:把按钮添加到窗体,并对按钮添加一个点击事件. 步骤: (1)创建窗体对象(2)创建按钮对象(3)把按钮添加到窗体(4)窗体显示 2.编写程序思路: 窗体布局:窗体中组件的排列方式  布局分类 ...

  5. tp集成支付宝担保支付

    现在的网站功能越来越全乎了,很多网站都需要做支付功能,而且很多大平台都提供了各式各样的api来扩充自己的用户和开发者.话说,这种使用大平台的api来做支付,无论是从成本上还是从开发效率上都是很好的选择 ...

  6. java 子类重写父类的方法应注意的问题

    若想实现一个合格重写方法,而不是重载,那么必须同时满足下面的要求! A.重写规则之一:    重写方法不能比被重写方法限制有更严格的访问级别.(但是可以更广泛,比如父类方法是包访问权限,子类的重写方法 ...

  7. SQL 中case when then else 用法

    SQL如下: SELECT DISTINCTsy_haken_type,sy_sagyo_type,sy_kokyaku_cdFROm tbl_syukeiWHERE (sy_sagyo_ymd be ...

  8. ASP.NET MVC 自我总结的便捷开发实例

    前言 工作了这么久了,接触ASP.NET MVC已经很久了,一直都想总结一下它的一些实用的,经常使用的一些技巧,但是因为一直都很懒,也不想总结,所以一直都没有好好写出来,趁着现在有这种冲劲,那么就先把 ...

  9. AngularJs的UI组件ui-Bootstrap-Tooltip

    完整案例,参考http://www.cnblogs.com/pilixiami/p/5661600.html <!DOCTYPE html> <html ng-app="u ...

  10. java 反射 - 获取成员变量的值.

    通过反射,可以获取所有声明的成员变量(包括所有的),代码如下: package spt.test.src; public class Person { private String name = &q ...