【数据结构】BitMap使用

本文深入探讨了Bitmap在大数据处理领域的应用,通过Java BitSet的实现方式,展示了如何高效地进行数据过滤与查找,特别关注了其在解决最长连续子序列问题上的独特优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

BitMap介绍

大数据是越来越火热的一个词语,对大数据的处理也同样是各种公司面试的常问题目。对大数据处理有几种通用的方式:分治,分布式,bitmap,bloom filter。bitmap与bloom filter主要是用于对大数据进行过滤,找到符合某些条件的数据。本文对bitmap进行简单分析。

java中有对bitmap的实现,是java,util.BitSet。

其提供了两种构造方法:

BitSet()
创建一个新的位 set。
BitSet(int nbits)
创建一个位 set,它的初始大小足以显式表示索引范围在 0nbits-1 的位。

BitSet所有的操作都是对某一位进行操作的,比如public void set(int bitIndex, boolean value) 就是对bitIndex这一位进行赋值操作,而不是对大小进行赋值。比如set(1, true)表示对第二位赋值为true,真实表现为10.如果想表示2曾经出现过,那么就需要set(1, true),因为2的二进制表示就是10。


其中BitSet提供了两种获取大小的方法,length(),size(),注意这两种方法是不同的。

length():返回此 BitSet 的“逻辑大小”:BitSet 中最高设置位的索引加 1。如果 BitSet 中不包含任何设置位,则返回零;比如你new了一个bitSet,bitSet(100,true)。那么对其调用length(),则返回的是101.

size():而这个方法返回的是在实际存储中,BitSet为了存储你的数据总过占据了实际位数是多少。比如,你使用了第二种构造方法new BitSet(100),在计算机中都是按照字节来标识,所以对于100肯定需要一个大约100的整字节数进行存储,这时候返回的size就是128.其实最主要的是BitSet内部封装了一个long型的数组,每次new一个新的BitSet对象都是对long型的数组进行分析和处理的。最后返回的位数其实就是需要几个long型的数字,比如128位,则其实是16个字节,则表示需要两个long型的数字来表示整个bitset。

最长子序列

给定一个数组,求该数组中最长的连续子序列。思路可以是先排序,但是排序都是需要O(nlogn)的复杂度,那有没有O(n)的负责度的算法那。答案肯定是有的,而且有很多种办法。本文是利用了bitmap,也可以利用hashmap。

思路:是先对数组进行遍历,对数组中的每个数在bitmap中设置为1,然后对bitmap进行遍历,查找最长连续出现的序列

private static void process() {
        int[] array = {15, 7, 12, 6, 14, 13, 9, 11};
        BitSet bitSet = new BitSet();
        for(int e : array){
            bitSet.set(e);
        }
        int max = 0;
        int tmp = 0;
        for(int i = 0; i < bitSet.size(); i ++){
            if(bitSet.get(i)){
                tmp += 1;
            }else{
                if(tmp > max){
                    max = tmp;
                }
                tmp = 0;
            }
        }
        System.out.println(max);
    }

    public static void main(String[] args) {
        process();
    }


Bitmap(位图)是一种用于高效存储和操作布尔值或状态信息的数据结构,它使用二进制位(bit)来表示数据,每个位只有0或1两种状态,通常用于表示集合、标记状态或快速查询某些属性的存在性。 ### Bitmap 的核心思想 - 使用一个或多个连续的二进制位来表示数据,每个位对应一个唯一的元素或状态。 - 例如,可以用一个位表示某个数字是否存在(1表示存在,0表示不存在)。 - Bitmap 的优势在于节省空间(一个位可以表示一个状态)和快速操作(位运算效率极高)。 ### Bitmap 的基本操作 1. **设置位(Set Bit)**:将某个位设置为1。 2. **清除位(Clear Bit)**:将某个位设置为0。 3. **检查位(Check Bit)**:检查某个位是否为1。 4. **位运算操作**:支持与、或、非、异或等位运算,用于批量操作。 ### Bitmap 的实现示例(Python) ```python class Bitmap: def __init__(self, size): self.size = size self.bits = bytearray((size + 7) // 8) # 每个字节存储8位 def set_bit(self, pos): if pos >= self.size: raise IndexError("Position out of range") index = pos // 8 offset = pos % 8 self.bits[index] |= (1 << offset) # 设置对应位为1 def clear_bit(self, pos): if pos >= self.size: raise IndexError("Position out of range") index = pos // 8 offset = pos % 8 self.bits[index] &= ~(1 << offset) # 设置对应位为0 def get_bit(self, pos): if pos >= self.size: raise IndexError("Position out of range") index = pos // 8 offset = pos % 8 return (self.bits[index] >> offset) & 1 # 返回对应位的值 # 示例用法 bitmap = Bitmap(16) bitmap.set_bit(3) bitmap.set_bit(5) print(bitmap.get_bit(3)) # 输出: 1 print(bitmap.get_bit(4)) # 输出: 0 bitmap.clear_bit(3) print(bitmap.get_bit(3)) # 输出: 0 ``` ### Bitmap 的应用场景 1. **布隆过滤器(Bloom Filter)**:用于快速判断一个元素是否在集合中(可能存在误判)。 2. **数据库索引**:用于快速查询某些字段的值是否存在。 3. **内存管理**:标记内存块的使用状态。 4. **排序和去重**:对整数进行高效排序或去重。 ### Bitmap 的优缺点 - **优点**: - 空间效率高(一个位表示一个状态)。 - 位运算操作速度快。 - **缺点**: - 只能表示布尔值或有限的状态。 - 对于稀疏数据可能浪费空间(可以使用压缩位图优化)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值