`

用bitmap节省存储空间

 
阅读更多
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
分享到:
评论

相关推荐

    c# 实现位图算法(BitMap)

    由于采用了 Bit 为单位来存储数据,因此可以大大节省存储空间。BitMap 可以看成一种数据结构,广泛应用于大量数据的存储和查询。 BitMap 的优点 1. 由于采用了 Bit 为单位来存储数据并建立映射关系来查找位置,...

    游戏开发BITMAP图片

    颜色索引是指在位图中,每个像素可能只使用有限的颜色,这种位图称为索引色位图,它节省存储空间但限制了色彩的丰富性。而alpha通道则代表图像的透明度,使得图像可以有不同程度的透明效果,这对游戏中的叠加层和...

    将Bitmap转成byte[]小例子

    在Android开发中,Bitmap是用于表示图像数据的一种对象,它在内存中占用较大空间,因此在处理图片时,我们有时需要将其转换为byte数组(byte[]),以便于存储、传输或者在网络流中使用。这个过程涉及到图像数据的...

    Android Bitmap 处理示例

    - **WebP格式**:WebP是一种轻量级的图片格式,相比JPEG和PNG能节省更多空间,适合在Android中使用。 - **位图压缩**:使用工具如TinyPNG对源图片进行预处理,减少无损压缩的体积。 - **Nine-Patch**:对于需要...

    Android图片Bitmap和字符串String之间的相互转换

    - **本地存储**:将Bitmap转换为String,可以方便地保存在SharedPreferences或数据库中,节省空间并简化操作。 - **分享功能**:当分享图片时,可以将Bitmap转换为String,然后嵌入到分享链接的HTML中。 提供的`...

    2-9+bitmap在连续留存分析中的使用.pdf

    Bitmap可以极大地节省存储空间,因为它只需要一个比特位来表示一个状态,相比于传统的数据结构,如列表或数组,其空间效率极高。 在Bitmap的实现中,有几种不同的容器类型,包括ArrayContainer、BitmapContainer和...

    安卓Android源码——(Bitmap位图渲染与操作).zip

    ARGB_8888是最通用但也是最占内存的,RGB_565则更节省空间。 - **Bitmap内存优化**:为了防止内存溢出,开发者需要合理管理Bitmap,如使用BitmapFactory.Options进行解码时指定缩放比例,或者使用SoftReference、...

    Springboot如何使用Redis bitmap实现签到功能含完整代码(值得珍藏)

    ### Spring Boot 如何使用 Redis Bitmap 实现签到...这种方法不仅能够节省存储空间,还能显著提高查询速度。开发者可以根据自身项目的实际情况调整相关的配置和策略,以满足不同的业务需求。希望本文能对您有所帮助!

    Bitmap大数据查找算法

    Bitmap,也被称为位图或位映射,是一种在计算机存储器中表示大量数据的有效方法,...在实际应用中,还需要考虑如何适应动态数据变化、节省存储空间以及并行处理等问题,这往往需要结合其他数据结构和算法来进一步优化。

    Bitmap 结构在高性能网络算法设计中的应用

    Bitmap是一种用于存储二进制数据的数据结构,它将每个元素映射为一个比特(bit),从而大大节省了内存空间。在高性能网络算法设计中,Bitmap的应用主要集中在快速查找、过滤和统计等场景,尤其是在处理大规模数据集...

    B-tree bitmap index

    - Oracle使用专有压缩技术压缩位图段,以节省存储空间。 - 适用于低基数列(即具有较少不同值的列),因为位图索引在这种情况下占用的空间较小。 - 在执行大量选择操作时特别有用,因为它能够通过位图快速确定哪些...

    24位bitmap 转1位bitmap 源码

    因此,1位Bitmap主要用于存储简单图形或线条艺术,或者用于节省内存和磁盘空间。 将24位Bitmap转换为1位Bitmap的过程涉及到颜色阈值处理。因为1位Bitmap只有两种颜色,所以需要确定一个阈值来决定哪些像素应被转换...

    libjpeg库压缩Bitmap

    在Android开发中,为了节省存储空间和网络传输的带宽,常常需要对Bitmap图像进行压缩。Libjpeg是一个广泛使用的开源JPEG编码和解码库,它提供了C语言接口,可以用于处理JPEG格式的图像数据。本篇文章将深入探讨如何...

    android 图片下载 能够节省空间 ,优化过的代码

    Android SDK支持WebP解码,可以节省存储空间。 3. **图片压缩**:在下载前或下载后对图片进行压缩,可以显著减小图片大小。例如,可以使用`BitmapFactory.Options`的`inSampleSize`参数来降低图片的分辨率,从而...

    7. BitMap-小小的身躯蕴含着大大的能量1

    Bitmap,也被称为位映射,是一种高效的数据结构,尤其在处理大数据时,它能节省大量存储空间。在Java中,Bitmap常用于存储大量的布尔值,每个位代表一个布尔状态,通常用于表示某个元素是否存在或者某个条件是否满足...

    解析bitmap处理海量数据及其实现方法分析

    - **空间效率**:对于小范围的整数,使用Bitmap比传统的数据结构(如数组、哈希表等)节省存储空间。 - **快速操作**:通过位运算,可以在常数时间内完成插入、删除和查找操作。 - **并行处理**:由于位运算的...

    Android-CompressHelper压缩文件压缩图片压缩Bitmap

    1. **文件压缩(CompressFile)**:这个功能允许开发者将大型文件压缩为更小的尺寸,以节省存储空间和网络传输时间。它可能采用常见的压缩算法如Gzip或Zip,通过读取文件内容,将其编码并写入新的压缩文件中。压缩...

    Android Activity之间传递图片(Bitmap)的方法

    因此,传递或存储Bitmap时,应考虑使用高效的数据结构(如LruCache),或者使用更节省内存的解决方案,如使用Uri或File路径来传递图片,而非直接传递Bitmap对象。此外,还可以利用Android的内存缓存策略和解码选项来...

    海量数据处理系列之:用C++实现Bitmap算法

    由于采用了Bit为单位来存储数据,因此在存储空间方面,可以大大节省。 适用范围:可进行数据的快速查找,判重,删除,一般来说数据范围是int的10倍以下基本原理及要点:使用bit数组来表示某些元素是否存在,比如8位...

    文件存储封装

    而对于大量二进制数据,可能需要利用二进制文件或特定的压缩格式以节省存储空间。 此外,文件存储封装还涉及到错误检查和恢复机制,如校验和、冗余数据等,以确保数据的完整性和一致性。同时,安全措施如加密和访问...

Global site tag (gtag.js) - Google Analytics