bitmap,即是用bit和存储数据组成map,这里以一个bit对应一个数据,也就是bit作为key,对应的数据则是value.这样一个很大的数据,我们用一个bit来存储,就节省了很大的存储空间。我们可以用一个例子来说明:
对5亿个int型数据进行排重。
首先,int型数据是32bit,那么5亿个int即使是排重以后,最多可占用2^32*4byte,也就是16G,我们的电脑内存当然是不够的。我们就可以试着用bitmap来解决问题。
如果用bit来标记int,那么存储空间要缩小到原来的32倍,只需0.5G。具体实现时,由于java中最小数据类型是byte,0.5G=2^32bit=2^29byte,我们可以先建立一个长度为2^29的byte型数组
byte[] b = new byte[2^29];
对这5亿个数据依次进行如下处理
val = n/8;
rem = n%8;
把b中第val个元素的第rem-1位用1表示相应的value存在。当处理完这5亿个数据后,分别找出数组b中2^32个bit中,第几个是1,那么第几个1对应的位置就是相应的数据。
用这个方法,我们可以解决对容量很大的两个整数集求交集的问题。当A、B两个整数集都很大时,要求它们的交集,我们用以下代码表示:
首先建立一个长度为2^32的String型数组(这里为了简便,直接用字符串表示出0、1串)从A、B两个文档中读取两个整数集
/**
* 从文件中读取数据,并把数据存入byte型数组中
* @param str
* @return
*/
public String[] createA(String str) {
String[] a = new String[max];
for(int i=0;i<max;i++){
a[i] = "00000000";
}
File file = new File(str);
try {
file.createNewFile();
FileReader r = new FileReader(file);
long len = file.length();
//以字符串的形式把整数读取过来
char c = (char) r.read();
int n = 0;
while(n<len){
String num = "";
while(c!=' '&&c!='\n'){
num = num+c;
c = (char) r.read();
n=n+1;
}
int i = Integer.parseInt(num);
System.out.println(i);
//把i存到数组中
toByte(i,a);
n++;
c = (char) r.read();
}
} catch (IOException e) {
e.printStackTrace();
}
return a;
}
/**
* 把int型i存入数组
* @param i
* @param a
*/
public void toByte(int i,String[] a){
int value = i/8;
int remain = i%8;
char[] c = a[value].toCharArray();
c[remain] = '1';
a[value]="";
for(int j=0;j<8;j++){
a[value]=a[value]+c[j];
}
}
再对两个数组进行比较,把相同的数据存入文档C
/**
* 比较获得两个数组中的整数,并把他们共同有的整数写到文件C里面
* @param a
* @param b
*/
public void compare(String[] a,String[] b){
File file = new File("d:/C.txt");
try {
file.createNewFile();
FileWriter writer = new FileWriter(file);
String aa;
String bb;
for(int i=0;i<max;i++){
System.out.println("a["+i+"]="+a[i]+","+"b["+i+"]="+b[i]);
aa = a[i];
bb = b[i];
for(int j=0;j<8;j++){
char a0 = aa.charAt(j);
char b0 = bb.charAt(j);
if(a0=='1'&&b0=='1'){
System.out.println("当有两个数相等时");
int v = i*8+j+1;
System.out.println("交集中有+++++++++++++++++"+v);
writer.write(v+" ");
}
}
}
writer.flush();
writer.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
当然,这里为了简便,使用了字符串,如果对位操作很熟悉的同学,也可以通过位操作来实现。
- 大小: 15.9 KB
- 大小: 10.9 KB
分享到:
相关推荐
由于采用了 Bit 为单位来存储数据,因此可以大大节省存储空间。BitMap 可以看成一种数据结构,广泛应用于大量数据的存储和查询。 BitMap 的优点 1. 由于采用了 Bit 为单位来存储数据并建立映射关系来查找位置,...
颜色索引是指在位图中,每个像素可能只使用有限的颜色,这种位图称为索引色位图,它节省存储空间但限制了色彩的丰富性。而alpha通道则代表图像的透明度,使得图像可以有不同程度的透明效果,这对游戏中的叠加层和...
在Android开发中,Bitmap是用于表示图像数据的一种对象,它在内存中占用较大空间,因此在处理图片时,我们有时需要将其转换为byte数组(byte[]),以便于存储、传输或者在网络流中使用。这个过程涉及到图像数据的...
- **WebP格式**:WebP是一种轻量级的图片格式,相比JPEG和PNG能节省更多空间,适合在Android中使用。 - **位图压缩**:使用工具如TinyPNG对源图片进行预处理,减少无损压缩的体积。 - **Nine-Patch**:对于需要...
- **本地存储**:将Bitmap转换为String,可以方便地保存在SharedPreferences或数据库中,节省空间并简化操作。 - **分享功能**:当分享图片时,可以将Bitmap转换为String,然后嵌入到分享链接的HTML中。 提供的`...
Bitmap可以极大地节省存储空间,因为它只需要一个比特位来表示一个状态,相比于传统的数据结构,如列表或数组,其空间效率极高。 在Bitmap的实现中,有几种不同的容器类型,包括ArrayContainer、BitmapContainer和...
ARGB_8888是最通用但也是最占内存的,RGB_565则更节省空间。 - **Bitmap内存优化**:为了防止内存溢出,开发者需要合理管理Bitmap,如使用BitmapFactory.Options进行解码时指定缩放比例,或者使用SoftReference、...
### Spring Boot 如何使用 Redis Bitmap 实现签到...这种方法不仅能够节省存储空间,还能显著提高查询速度。开发者可以根据自身项目的实际情况调整相关的配置和策略,以满足不同的业务需求。希望本文能对您有所帮助!
Bitmap,也被称为位图或位映射,是一种在计算机存储器中表示大量数据的有效方法,...在实际应用中,还需要考虑如何适应动态数据变化、节省存储空间以及并行处理等问题,这往往需要结合其他数据结构和算法来进一步优化。
Bitmap是一种用于存储二进制数据的数据结构,它将每个元素映射为一个比特(bit),从而大大节省了内存空间。在高性能网络算法设计中,Bitmap的应用主要集中在快速查找、过滤和统计等场景,尤其是在处理大规模数据集...
- Oracle使用专有压缩技术压缩位图段,以节省存储空间。 - 适用于低基数列(即具有较少不同值的列),因为位图索引在这种情况下占用的空间较小。 - 在执行大量选择操作时特别有用,因为它能够通过位图快速确定哪些...
因此,1位Bitmap主要用于存储简单图形或线条艺术,或者用于节省内存和磁盘空间。 将24位Bitmap转换为1位Bitmap的过程涉及到颜色阈值处理。因为1位Bitmap只有两种颜色,所以需要确定一个阈值来决定哪些像素应被转换...
在Android开发中,为了节省存储空间和网络传输的带宽,常常需要对Bitmap图像进行压缩。Libjpeg是一个广泛使用的开源JPEG编码和解码库,它提供了C语言接口,可以用于处理JPEG格式的图像数据。本篇文章将深入探讨如何...
Android SDK支持WebP解码,可以节省存储空间。 3. **图片压缩**:在下载前或下载后对图片进行压缩,可以显著减小图片大小。例如,可以使用`BitmapFactory.Options`的`inSampleSize`参数来降低图片的分辨率,从而...
Bitmap,也被称为位映射,是一种高效的数据结构,尤其在处理大数据时,它能节省大量存储空间。在Java中,Bitmap常用于存储大量的布尔值,每个位代表一个布尔状态,通常用于表示某个元素是否存在或者某个条件是否满足...
- **空间效率**:对于小范围的整数,使用Bitmap比传统的数据结构(如数组、哈希表等)节省存储空间。 - **快速操作**:通过位运算,可以在常数时间内完成插入、删除和查找操作。 - **并行处理**:由于位运算的...
1. **文件压缩(CompressFile)**:这个功能允许开发者将大型文件压缩为更小的尺寸,以节省存储空间和网络传输时间。它可能采用常见的压缩算法如Gzip或Zip,通过读取文件内容,将其编码并写入新的压缩文件中。压缩...
因此,传递或存储Bitmap时,应考虑使用高效的数据结构(如LruCache),或者使用更节省内存的解决方案,如使用Uri或File路径来传递图片,而非直接传递Bitmap对象。此外,还可以利用Android的内存缓存策略和解码选项来...
由于采用了Bit为单位来存储数据,因此在存储空间方面,可以大大节省。 适用范围:可进行数据的快速查找,判重,删除,一般来说数据范围是int的10倍以下基本原理及要点:使用bit数组来表示某些元素是否存在,比如8位...
而对于大量二进制数据,可能需要利用二进制文件或特定的压缩格式以节省存储空间。 此外,文件存储封装还涉及到错误检查和恢复机制,如校验和、冗余数据等,以确保数据的完整性和一致性。同时,安全措施如加密和访问...