`
luozhong915127
  • 浏览: 186144 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
文章分类
社区版块
存档分类
最新评论

java Bitmap 数据结构

阅读更多

Bitmap算法,
问题:对40亿个数据进行排序,数据类型为 int,无相同数据。

思考:关于40亿个数据的排序,首先想如何存储呢?一个int 4个字节,也就是160亿个字节,也就是大概有16GB的数据,现在所有的计算机估计

没有这么大的内存吧,所以我们就可以文件归并排序,也可以分段读入数据在进行Qsort,但是都需要不停地读入文件,可以想象不停地读取文件硬件操作会有多么浪费时间。

 

我们这样都是用4个字节来存储了一个数据,在计算机里都是用二进制进行表示,

例如 5 :0000 0000 0000 0000 0000 0000 0000 0101

现在引入Bitmap,所谓Bitmap就是用一个bit来表示一个数据。平时32位存储一个数据,我们可以换一种想法,用一个字节32位来存储0-31这32个数据,例如我们对2,1,5,12这四个数据进行由小到大的排序,首先把32位初始化为0,我们可以把这4个数据存储为0000 0000 0000 0000 0001 0000 0010 0110

 

我们就把32位中的分别把 2  1  5  12位置为1,然后从第0位开始遍历,看相应位是否为1,为1就进行输出,就完成了数据从小到大的排序。

 

再返回原题应用Bitmap就可以把16GB的存储空间缩小为16GB/32 = 512M,就可以大大减少读取文件的工作。直接读一次文件存入内存,然后遍历输出就完成了排序。

 

优点:既大量节省了空间,又把时间复杂度降低到O(n)。

不足:如果数据过于稀疏就会有大量无用遍历,浪费时间。

 



 

 

对于几亿int数据如要查找出相等的数据,利用Bitmap算法,只是使byte达到了极限,也是一种解决问题的一种方法。下一篇描述讲一下源代码的

描写。

  • 大小: 14 KB
5
3
分享到:
评论
18 楼 luozhong915127 2012-09-15  
逸情公子 写道
引用
首先把32位初始化为0,
我们可以把这4个数据存储为0000 0000 0000 0000 0001 0000 0010 0110

这个是怎么存储出来的,没看明白。。

位运算



首先,明白存储是按字节存储的。接着就明白,一个整数要四个字节,而现在用Bitmap一个整数就对应一个整数。例如,这么一串数据byte[a[i]]={0,0,0,0,1,0,1,0}  就代表在整数为:1,3 ;因为a[1]=1,a[3]=1;就这样存储的。
17 楼 逸情公子 2012-08-14  
引用
首先把32位初始化为0,
我们可以把这4个数据存储为0000 0000 0000 0000 0001 0000 0010 0110

这个是怎么存储出来的,没看明白。。

位运算
16 楼 paladin1988 2012-08-14  
首先把32位初始化为0,
我们可以把这4个数据存储为0000 0000 0000 0000 0001 0000 0010 0110

这个是怎么存储出来的,没看明白。。
15 楼 luozhong915127 2012-08-02  
MyEyeOfJava 写道
nagat1111 写道
16G内存到处都是。。。

最看不起你这种的。。。

每个人都是从看不起,到看得起的。你认为本来或者一直被别人看得起的人。
14 楼 MyEyeOfJava 2012-08-01  
nagat1111 写道
16G内存到处都是。。。

最看不起你这种的。。。
13 楼 luozhong915127 2012-03-25  
请问一下,任你的负数有多大吧,转化为整数,他也只是是个1呀,转化的这个整数始终是下标 而已呀。
12 楼 wooyon 2012-03-25  
luozhong915127 写道
请问一下,你以为电脑就回去识别负数,只是我去定义正数与负数而已,他只能去识别二进制而已,在硬件中,底层的设计用高低电平来表示0和1.你以为负电压可以表示负数是吧。负数相等于原码取反加1呀,你应该学过计算机基础呀。大哥呀

晕死,跟我谈教材,算法问题,还扯蛋到硬件,大哥 这和硬件有个毛联系啊!你有没弄清我质问的内容啊?! 我的意思是 按你说的这种思路,理论上正负数的差别会使你的操作付出双倍代价,而不是简单的一句“那负数也可以转化正数呀。”——大哥,这可不仅是正负转化的操作!!!
11 楼 luozhong915127 2012-03-22  
请问一下,你以为电脑就回去识别负数,只是我去定义正数与负数而已,他只能去识别二进制而已,在硬件中,底层的设计用高低电平来表示0和1.你以为负电压可以表示负数是吧。负数相等于原码取反加1呀,你应该学过计算机基础呀。大哥呀
10 楼 pywepe 2012-03-22  
  我记得有一种算法就是这种思想,忘记叫什么名字了
  n位上标记一下,表示n
9 楼 wooyon 2012-03-22  
对这个种问题,直接的做法是分而治之,怎么会有这种空想,按这种想法,其中的负数问题可不是这么简单的一句能摆平的哦,你晓不晓得负数的二进位怎么表示的啊?
8 楼 luozhong915127 2012-03-22  
那负数也可以转化正数呀。
7 楼 b_l_east 2012-03-22  
负数怎么办?!
6 楼 nagat1111 2012-03-22  
16G内存到处都是。。。
5 楼 luozhong915127 2012-03-21  
byte可以存储8*2^32就能存储2G呀,他是利用0与1来表示的。你可看一下这个图
4 楼 luozhong915127 2012-03-21  
Bitmap可以自己写一个,专门用于算法的描写,Bitmap只是去解决一个巨大的数怎样减小存储空间。那里面的byte是到极限了。
3 楼 canghailan 2012-03-21  
java.util.BitSet
2 楼 youjianbo_han_87 2012-03-21  
问个问题,如果int值比较大

"用一个字节32位来存储0-31这32个数据" 这句是不是就有问题,一个字节不一定能放下32个数。

1 楼 逸情公子 2012-03-21  
貌似J2SE中没有BitMap啊。这该肿么办呀?

相关推荐

    RoaringBitmap, 在Java中,一个更好的压缩 bitset.zip

    RoaringBitmap, 在Java中,一个更好的压缩 bitset RoaringBitmap Bitsets,也称为位图,通常用作快速数据结构。 不幸的是,他们可以使用太多的内存。 为了补偿,我们经常使用压缩位图。咆哮位图是压缩位图,它比传统...

    使用纯Java语言写出来的数据结构

    使用纯Java语言写出来的数据结构,包含数据结构有 单向链表,双向链表,单向循环链表,双向循环链表,二叉树,队列,栈等, 关于实现的种类有分多种类型,包含有链表或者数组,二叉树里面包含有常见的二叉查找树,...

    高级数据结构及应用之使用bitmap进行字符串去重的方法实例

    今天小编就为大家分享一篇关于高级数据结构及应用之使用bitmap进行字符串去重的方法实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

    RoaringBitmap:Java中更好的压缩位集

    咆哮位图 位集(也称为位图)通常用作快速数据结构。 不幸的是,它们会占用过多的内存。 为了补偿,我们经常使用压缩的位图。 咆哮的位图是压缩的位图,其性能通常优于传统的压缩位图,例如WAH,EWAH或Concise。 在...

    数据结构与算法.xmind

    数据结构与算法 排序算法 内排序 八大基础排序 选择排序 简单选择排序 思想 每次选择最大的数插入到末尾中 做法 外层for循环控制次数 内层for循环找出最大的值的角...

    基于Java实现的火车票抢票并发数据结构处理.zip

    购票时系统在阈值次数内采用随机分配的方式产生车票,并对该车票进行检查,即查询 该车票是否可购买,如果可购买,则对该座位进行加锁(lock),之后再重复一次检查,若依 旧可购买,则对该 Seat 上的 bitmap 进行...

    java 原生包 BitSet 源码

    Java 原生包 BitSet 源码,0~3年 Java 工程师必看,属于高级数据结构,利于进阶,面试必备!

    c# 实现位图算法(BitMap)

    BitMap可以看成一种数据结构。 假设有这样一个需求:在20亿个随机整数中找出某个数m是否存在其中,并假设32位操作系统,4G内存。 在Java中,int占4字节,1字节=8位(1 byte = 8 bit)。 如果每个数字用int存储,那...

    java bitset 源码解析.rtf

    java bitset 高级数据结构 源码解析 适合 0-3 年开发人员,进阶、面试必备知识!

    SHARE:用来替代sharedpreferences.支持 object,bitmap等

    另外,sharedpreferences 不能存类,集合和bitmap等数据!这点也让人非常不爽啊!所以,我就在这个美好的星期天撸了名为 SHARE 的工具类用来替代 sharedpreferences。 ##项目介绍 整体架构 先来看一下,整体架构图...

    roaringbitmap:Cython中咆哮的位图

    咆哮的位图是一种有效的压缩数据结构,用于存储一组整数。 咆哮位图将一组32位整数存储在一系列数组和位图中,以空间最小的方式(始终为2 ** 16位或更小)。 此数据结构可用于存储大量整数,例如,用于搜索引擎和...

    深入理解Activity之间的数据传递

    那么对于用户自己定义的数据结构是无法直接用Intent来传送的,如果想要通过Intent来传递自定义数据,可以让数据结构实现Parcelable接口,这样就可以把数据放入Intent。但是Intent的传送效率也不是很高,特别是当传递...

    roaring-rs – Rust中的咆哮位图-Rust开发

    这是Roaring位图数据结构的Rust端口,最初定义为Java库,并在“使用Roaring位图提高位图性能”中进行了描述。 Rust版本策略此板条箱仅支持Rust的当前稳定版本,修补程序版本可能随时使用新功能。 开发此项目使用了...

    constjs:从键字符串生成常量数据结构

    constjs 使用在字符串,数组,对象或参数中指定的键名创建const / enum / bitmap对象用法npm install constjs 枚举(Java样式) var ConstJs = require ( 'constjs' ) ;var Colors = ConstJs . enum ( "blue red" ) ...

    blog:算法,WebRTC,节点,微服务,Golang,ELK,Kubernetes,Istio,JAVA,PHP,MongoDB,Ningx,OpenResty,GraphQL ..

    Go 开源项目 MIMIO 的对象存储方案在探探的实践分布式分布式事务etcd 的实现原理数据结构与算法基础Dijkstra什么是 Bitmap 算法?Bitmap算法(进阶篇)最小栈的实现判断 2 的乘方找出缺失的整数辗转相除法是什么鬼?...

    infobright包

    虽然说 Infobright 没有提供索引结构,但它 Knowledge Grid 中的 Numerical Histogram、Character Map 和 Pack-to-Pack 结构,怎么看都和 bitmap 索引脱不了关系。只是它的组织形式不像传统数据库中的索引罢了。 ...

    PContour:用于在二进制图像中查找轮廓的ProcessingJava库

    PContour Java /库,用于在二进制图像中查找轮廓,该库由CMU。| | 与的cv::findContours和cv:... 最初的计划是移植OpenCV实现( ),但他们的计划主要面向C / C ++内存管理,并与库中其余部分的数据结构交织在一起。 缺

    Java版水果管理系统源码-some-knowledge:朋友给的Android面试题,自己总结的答案

    Java版水果管理系统源码 some knowledge Android Android性能优化方案(如内存优化、网络优化、布局...使用经过优化后的数据容器,常规的HashMap效率低下,建议使用Android优化过的数据容器,如SparseArray,它可以避

    FastBitSet.js:针对现代浏览器和JavaScript引擎的速度优化的BitSet实现

    当存储的值是相当小的整数时,BitSet(也称为Bitmap或位向量)是实现一组的理想数据结构。 它可能比通用集实现快几个数量级。 特别是,BitSet具有对设置操作(联合,差,交)的快速支持。 FastBitSet.js实现为速度...

    新版Android开发教程.rar

    ----------------------------------- Android 编程基础 1 封面----------------------------------- Android 编程基础 ...• SQLite SQLite SQLite SQLite 用作结构化的数据存储 • 多媒体支持 包括常见的音频、视频和...

Global site tag (gtag.js) - Google Analytics