位图 vs 布隆过滤器

位图(Bitmap)

位图是一种数据结构,用于存储大量的布尔型数据(即每个数据只有两种状态:0或1)。它通过使用每一位来表示一个状态,从而节省内存空间并提高操作效率。在计算机中,最小的存储单位是字节(byte),而位图则是利用位(bit)来进行数据存储和操作。

位图的实现

在C++中,位图可以通过一个整数数组来实现。每个整数可以存储32个状态(因为一个整数有32位)。用户可以提供一个数据量,这个数据量决定了位图需要多少个整数来存储。

#include <vector>
#include <iostream>

class BitMap {
   
public:
    BitMap(size_t size) : bits((size >> 5) + 1, 0) {
   } // size >> 5 等价于 size / 32

    void set(size_t num) {
   
        size_t index = num >> 5; // 等价于 num / 32
        size_t pos = num & 31;   // 等价于 num % 32
        bits[index] |= (1 << pos);
    }

    bool test(size_t num) {
   
        size_t index = num >> 5;
        size_t pos = num & 31;
        return bits[index] & (1 << pos);
    }

    void reset(size_t num) {
   
        size_t index = num >> 5;
        size_t pos = num & 31;
        bits[index] &= ~(1 << pos);
    }

private:
    std::vector<uint32_t> bits
位图(Bitmap)布隆过滤器(Bloom Filter)都是常用的数据结构,用于处理大规模数据集合,但它们有着不同的应用场景用途。 位图是一种压缩数据结构,用于快速地判断某个元素是否在集合中。位图的实现方式是将每个元素映射到一个二进制位上,如果该元素存在于集合中,则将对应的二进制位标记为1,否则标记为0。这样,当需要查询某个元素是否在集合中时,只需要查找对应的二进制位即可。由于位图的实现方式非常简单,因此可以快速地进行插入查询操作,而且占用的空间也非常小,适合处理大规模数据集合。 布隆过滤器也是一种快速判断元素是否存在于集合中的数据结构,但其实现方式与位图略有不同。布隆过滤器使用一组哈希函数将元素映射到多个二进制位上,并将对应的二进制位标记为1。当查询某个元素是否在集合中时,将该元素进行哈希映射,并查找对应的二进制位,如果所有的二进制位都被标记为1,则说明该元素可能存在于集合中,否则可以确定该元素不存在于集合中。布隆过滤器的优点是可以快速地判断一个元素不存在于集合中,而且占用的空间也比较小,但存在误判率的问题。 因此,位图布隆过滤器虽然都可以用来处理大规模数据集合,但它们的实现方式应用场景有所不同。位图适用于需要快速地判断某个元素是否在集合中的场景,而布隆过滤器适用于需要快速地判断一个元素不存在于集合中的场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

「已注销」

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值