bitmap思想及其在java中的相关实现

先看一个题目:

给你一堆西安市的电话号码列表,数量大概在千万级,

要求从中找出所有重复的电话号码,需要时间复杂度尽可能小。

目前西安市的电话号码大概都以8开头,为8位,也就是

类似于82678578这样子

二重暴力搜索时间复杂度太高,这里我们不予考虑。

容易想到的办法就是建立一个标志数组,

int boolean都行,用相应的位置值来代替这个号码是否出现,

根据数组的可直接存取特性,来提高效率。

但是你是否想过或测试过

int[] a = new int[100000000];

boolean[] a = new boolean[100000000];

这样类似的语句是否可以通过编译并且执行。

再仔细思考下,就会发现,int型的字段太过于占空间,我们只需要知道这个号码存在与否,

所以最简单的0和1就够用了,能表示0和1的最小存储单位是什么呢?

是内存中的一位。

OK,这就是bitmap的思想。

将西安市的电话号码去掉开头的8,就可以将其映射到一个1到10000000的数组中。

8bit是1byte,1024byte是1kb,1024kb是1mb

所以10000000个bit占用的空间为

10000000/8/1024/1024mb大概为1mb多些,

这对于现在大家动不动几G的内存来说,完全是小菜一碟。

同时,java中也有对应的实现,java.util.BitSet,

完全是为这个量身定做的java类。

这个类从jdk1.0开始就有了,不过其中的某些方法是jdk1.4以后才有的,

大家用的时候要当心。

另外BitSet是非线程安全的,需要外部同步。

下面的简单代码给出了BitSet的例子:

 

位图(Bitmap)是一种用于表示图像的数据结构,也是图形图像处理的基础。它是由像素点(Pixel)组成的矩阵,每个像素点用二进制数表示其对应的颜色,通常一个像素点占用一个或多个字节的存储空间。 在Java,可以通过java.awt.image.BufferedImage类实现位图的创建和编辑。下面是一个简单的Java代码示例,用于创建一张黑色背景、红色前景的位图,并将其保存为文件: ```java import java.awt.Color; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.File; import javax.imageio.ImageIO; public class BitmapExample { public static void main(String[] args) { int width = 256; int height = 256; BufferedImage bitmap = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); Graphics g = bitmap.getGraphics(); g.setColor(Color.BLACK); g.fillRect(0, 0, width, height); g.setColor(Color.RED); g.fillOval(64, 64, 128, 128); g.dispose(); try { ImageIO.write(bitmap, "bmp", new File("example.bmp")); } catch (Exception e) { e.printStackTrace(); } } } ``` 在上面的代码,我们首先创建了一个宽度和高度均为256像素的位图,然后使用Graphics对象绘制了一个黑色背景和一个红色的圆形。最后,我们将位图保存为一个bmp格式的文件,以便在其他应用程序使用。 除了BufferedImage类外,还有许多其他的Java图像处理库和工具,如ImageJ、JAI、JavaFX等,它们都提供了不同程度的位图编辑和处理功能,可以根据具体需求选择适合自己的工具。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值