`
luozhong915127
  • 浏览: 189158 次
  • 性别: 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啊。这该肿么办呀?

相关推荐

    bitmap数据结构复制

    Bitmap数据结构是计算机图形学和图像处理领域中的一个重要概念,特别是在低级编程和系统级操作中,例如在操作系统内核、设备驱动程序或游戏引擎中。Bitmap,也称为位图,是一种像素阵列的表示方式,它直接存储了图像...

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

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

    android数据Bitmap数据的过程

    2. **Bitmap**: `Bitmap`是Android中用于表示图像的数据结构,它包含像素数组,每个像素代表图像中的一个点。 3. **Blob**: 在数据库术语中,“Blob”(Binary Large Object)是指可以存储大量二进制数据的字段类型...

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

    "高级数据结构及应用之使用bitmap进行字符串去重的方法实例" 本文主要讨论了使用Bitmap来实现字符串去重的方法实例。Bitmap是一种位图数据结构,由单个元素为boolean(0/1,0表示未出现,1表示已经出现过)的数组。...

    如何基于Java实现数据结构链表相关程序.pdf

    链表是一种基本的数据结构,由一系列节点组成,每个节点包含数据部分和指向下一个节点的引用。在C或C++中,通常使用指针来实现链表。然而,在Java中,由于没有直接的指针概念,链表的实现需要使用对象的引用。在Java...

    Java Windows Bitmap decoder and encoder

    Java Windows Bitmap(BMP)编码器与解码器是一个用于处理图像文件的工具,它允许在Java环境中读取和创建Windows BMP格式的图像。BMP是一种无损的图像存储格式,广泛应用于各种操作系统中,尤其是Windows系统。由于...

    面试题集,包含Android、Java、数据结构、算法等.docx

    9. **Bitmap内存计算**:Bitmap占用的内存大小等于宽度、高度像素乘以每个像素占用的字节数(取决于颜色格式),例如ARGB_8888每个像素占用4字节。 10. **混合开发**:React Native、Weex和H5都是常见的混合开发...

    Bitmap全面解析

    在Android开发中,Bitmap是一种用于处理图片的像素数组的数据结构。对于大尺寸图片的处理一直是Android图形处理的一个重点和难点。当ImageView的尺寸和要加载的图片尺寸差距很大时,如果直接加载原图到内存中,不仅...

    8583bitmap组包工具

    这个协议定义了交易数据的结构和格式,包括交易类型、金额、日期等关键信息。在8583协议中,位图(Bitmap)是报文结构的一部分,用于指示各个域是否被使用,从而帮助解析和构建报文。 这款工具的核心功能在于提供...

    redis数据结构基础知识及案列(每个数据结构一个案例).zip

    在【大学生 C/C++/JAVA/Python数据结构学习笔记和资料大全】中,你可以找到更多关于数据结构和算法的知识,这些是理解和使用Redis数据结构的基础。通过深入学习和实践,你不仅可以掌握Redis的使用,还能提升自己的...

    java 实现 bmp 转 jpg

    在Java编程语言中,将BMP(Bitmap)图像格式转换为JPEG(Joint Photographic Experts Group)格式是一项常见的图像处理任务。BMP是一种无损、未经压缩的图像格式,而JPEG则是一种广泛使用的有损压缩格式,适合存储...

    Bitmap位图缩放范例

    在Android开发中,Bitmap对象是用于存储和处理像素数据的核心类,而缩放Bitmap是优化资源显示和节省内存的重要手段。 在Android中,Bitmap的缩放主要通过以下几种方式实现: 1. **使用Bitmap.createScaledBitmap()...

    redis_java

    Redis,全称Remote Dictionary Server,是一个开源的、基于键值对的数据存储系统,以其高性能、易用性以及丰富的数据结构而被广泛应用于缓存、消息队列、计数器等多种场景。它支持多种数据类型,如字符串(strings)...

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

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

    二维码BitMap图片解析

    Bitmap是Android系统中用于表示图像的一种数据结构。在Android开发中,Bitmap对象主要用于存储和处理图像数据。它提供了一系列方法来操作图像,如压缩、旋转、裁剪等。 #### 三、二维码解析原理 二维码的解析过程...

    RoaringBitmap.zip

    RoaringBitmap是一个在Java中广泛使用的高效位图数据结构,尤其适用于大数据和搜索引擎等领域。它在处理大规模数据集时能够提供显著的性能优势,比传统的布隆过滤器(Bloom Filter)和Java内置的BitSet类更为高效。...

    通过将资源库图片转化为Bitmap,使用Zxing库完成多二维码识别

    在Android中,Bitmap是用于表示图像的一种内存高效的数据结构。你可以通过以下代码将图片资源转换为Bitmap: ```java Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.your_image); ``` ...

    RoaringBitmap:Java中更好的压缩位集

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

    redis 的bitmap点赞功能的应用源码.zip

    Redis中的Bitmap是一个非常高效的数据结构,它用于存储和操作位序列。在社交网络或内容分享平台上,点赞功能是非常常见的,用户可以对喜欢的内容进行点赞,系统需要记录这些点赞行为。在大数据量的情况下,传统的...

    android 获取界面部分view,view截图,生成bitmap图片

    Bitmap是Android中用于表示图像数据的类,它提供了丰富的操作方法,如缩放、裁剪、旋转等。在生成Bitmap后,我们可以使用`Bitmap.createScaledBitmap()`进行尺寸调整,`Bitmap.createBitmap()`用于创建一个新的...

Global site tag (gtag.js) - Google Analytics