Java位集合之BitMap

ops/2024/9/25 8:52:08/

文章目录

  • Java位集合之BitMap
    • 一、引言
    • 二、BitMap原理
      • 1、BitMap简介
      • 2、BitMap存储原理
    • 三、BitMap实现
      • 1、IntMap实现
      • 2、LongMap实现
    • 四、BitMap应用
      • 1、快速排序
      • 2、快速去重
      • 3、快速查找
    • 五、总结

Java位集合之BitMap

一、引言

在计算机科学中,位图(BitMap)是一种非常高效的数据结构,它使用位(bit)来表示数据。在Java中,位图可以用于多种场景,如快速排序、快速去重、快速查找等。本文将详细介绍Java中的位图实现,包括其原理、应用以及如何使用。

二、BitMap原理

1、BitMap简介

BitMap的基本思想是使用一个bit位来标记某个元素对应的值。由于采用bit为单位存储数据,因此在存储空间方面可以大大节省。例如,在32位机器上,一个int类型的变量占用32个bit,而BitMap可以用这32个bit来表示0到31这32个整数的状态。

2、BitMap存储原理

在Java中,我们可以使用数组来实现BitMap。例如,使用一个int数组,每个元素的32个bit分别表示一个整数是否存在。添加一个整数时,我们计算其在数组中的索引和在该元素中的bit位置,然后通过位运算将其设置为1。查找时,同样计算索引和位置,检查对应的bit是否为1。

三、BitMap实现

1、IntMap实现

IntMap是使用int数组实现的BitMap。以下是IntMap的简单实现:

java">public class IntMap implements BitMap, Serializable {private static final long serialVersionUID = 1L;private final int[] ints;public IntMap() {this.ints = new int[93750000];}public IntMap(int size) {this.ints = new int[size];}public void add(long i) {int r = (int)(i / 32L);int c = (int)(i % 32L);this.ints[r] |= 1 << c;}public boolean contains(long i) {int r = (int)(i / 32L);int c = (int)(i % 32L);return (this.ints[r] >>> c & 1) == 1;}public void remove(long i) {int r = (int)(i / 32L);int c = (int)(i % 32L);this.ints[r] &= ~(1 << c);}
}

2、LongMap实现

LongMap是使用long数组实现的BitMap,原理与IntMap类似,但是使用long类型,可以存储更大的整数。

java">public class LongMap implements BitMap, Serializable {private static final long serialVersionUID = 1L;private final long[] longs;public LongMap() {this.longs = new long[93750000];}public LongMap(int size) {this.longs = new long[size];}public void add(long i) {int r = (int)(i / 64L);long c = i % 64L;this.longs[r] |= 1L << (int)c;}public boolean contains(long i) {int r = (int)(i / 64L);long c = i % 64L;return (this.longs[r] >>> (int)c & 1L) == 1L;}public void remove(long i) {int r = (int)(i / 64L);long c = i % 64L;this.longs[r] &= ~(1L << (int)c);}
}

四、BitMap应用

1、快速排序

原理:使用BitMap可以快速对一组整数进行排序。首先,创建一个足够大的BitMap,将每个整数的对应位置设置为1。然后,遍历BitMap,将为1的位置对应的整数输出,即可得到排序后的整数序列。

示例

假设我们有一组数字:4, 7, 2, 5, 3,我们想要对其进行排序。我们可以创建一个BitMap,其中每个数字表示一个位,如果该数字在数组中出现,则将对应的位设置为1。遍历这个BitMap,输出所有为1的位所表示的数字,即可得到排序后的结果。

java">public static void main(String[] args) {int[] numbers = {4, 7, 2, 5, 3};IntMap intMap = new IntMap();for (int number : numbers) {intMap.add(number);}for (int i = 0; i < intMap.ints.length; i++) {for (int j = 0; j < 32; j++) {if ((intMap.ints[i] >>> j & 1) == 1) {System.out.print((i * 32 + j) + " ");}}}
}

2、快速去重

原理:在处理大量数据时,可以使用BitMap来快速去除重复的整数。对于每个整数,计算其在BitMap中的位置,如果该位置已经为1,则表示该整数已经出现过;如果为0,则将其设置为1,表示该整数是第一次出现。

示例

假设我们有一组整数:3, 5, 3, 9, 5,我们想要去除重复的数字。我们可以使用BitMap来实现:

java">public static void main(String[] args) {int[] numbers = {3, 5, 3, 9, 5};IntMap intMap = new IntMap();for (int number : numbers) {if (!intMap.contains(number)) {intMap.add(number);}}for (int i = 0; i < intMap.ints.length; i++) {for (int j = 0; j < 32; j++) {if ((intMap.ints[i] >>> j & 1) == 1) {System.out.print((i * 32 + j) + " ");}}}
}

3、快速查找

原理:BitMap可以快速判断一个整数是否存在于一个集合中。只需检查该整数在BitMap中对应的位置是否为1,即可知道该整数是否存在。

示例

假设我们有一个集合{1, 2, 4, 8},我们想要检查数字5是否存在于这个集合中。我们可以使用BitMap来实现:

java">public static void main(String[] args) {int[] numbers = {1, 2, 4, 8};IntMap intMap = new IntMap();for (int number : numbers) {intMap.add(number);}System.out.println("Does the number 5 exist in the set? " + intMap.contains(5));System.out.println("Does the number 4 exist in the set? " + intMap.contains(4));
}

五、总结

BitMap是一种高效的数据结构,特别适合于处理大量数据的快速排序、查找和去重等操作。在Java中,我们可以通过简单的数组和位运算来实现BitMap,从而节省存储空间并提高性能。


版权声明:本博客内容为原创,转载请保留原文链接及作者信息。

参考文章

  • Java 中 BitMap (位图)hutool版、IntMap、LongMap_hutool bitmap-CSDN博客
  • Java位集合

http://www.ppmy.cn/ops/115714.html

相关文章

PlayerPerfs-不同平台的存储位置

一 .PlayerPrefs存储的数据存在哪里 不同平台存储位置不一样 Windows PlayerPrefs 存储在 HKCU\Software\[公司名称]\[产品名称] 项下的注册表中 其中公司和产品名称是 在“Project Settings”中设置的名称。 查看方法&#xff1a; 运行 regedit HKEY…

学习大数据DAY60 多表数据清洗

当前会有已抽取好的数据存放在 ODS 层 通过数据清洗, 把数据存放在 DWD 层 数据清洗的规范 crm_user_base_info_his_full erp_u_memcard_reg_full erp_u_sale_m_inc erp_u_sale_pay_inc erp_c_memcard_class_group_full his_chronic_patient_info_new_full 从简单到复…

SpringBoot文档管理系统:架构与功能

第2章相关技术 2.1 Java技术介绍 Java语言擅长开发互联网类应用和企业级应用&#xff0c;现在已经相当的成熟&#xff0c;而且也是目前使用最多的编程语言之一。Java语言具有很好的面向对象性&#xff0c;可以符合人的思维模式进行设计&#xff0c;封装是将对象的属性和方法尽可…

C# 入坑JAVA 潜规则 大小写敏感文件名和类名 枚举等 入门系列2

java 项目结构 文件说明 潜规则 java入门-CSDN博客 Java 对大小写敏感 如文件名和类名。 D:\now\scx\scx-cloud\scx-cloud\scx-module-system\scx-module-system-biz\src\main\java\com\scm\scx\module\system\controller\app\compublic\compublicController.java:29:8 java:…

Go进阶概览 -【7.1 反射机制与动态编程】

7.1 反射机制与动态编程 反射是Go语言的一项强大特性&#xff0c;使得程序可以在运行时检查和修改自身的结构和行为。 反射机制的使用在一些动态编程场景中非常重要&#xff0c;但同时也带来了一定的性能开销。 本节我们将深入解析Go的反射机制&#xff0c;探讨其在动态编程…

WPF 控件数据源绑定

WPF 控件数据源绑定 前提&#xff1a;我的数据源都放在 DataProcessView 类中&#xff0c;然后在 MainWindow 中声明该类的对象 DataProcess&#xff0c;如果是指定了 DataContext &#xff0c;就将该对象赋值给 DataContext &#xff08;如下&#xff09;&#xff0c;否则不赋…

unix中如何查询和修改进程的资源限制

一、前言 一个进程在运行时&#xff0c;会用到各种资源&#xff0c;比如cpu的使用时间、内存空间、文件等等。那么&#xff0c;一个进程能够占用多少资源呢&#xff1f;cpu使用的时间有多长&#xff1f;进程空间有多大&#xff1f;能够创建多少个文件&#xff1f;这个就是本文…

专利管理系统如何高效实现五书转档为XML?

在专利管理领域&#xff0c;五书&#xff08;申请书、说明书、权利要求书、附图说明、摘要&#xff09;转档为XML格式是一项至关重要的工作。XML&#xff08;可扩展标记语言&#xff09;具有良好的结构性、扩展性和数据交换性。将五书转换为XML格式能够方便专利数据在不同系统之…