每日一题——位图

定义:位图(bitmap)就是利用每一位来存储某种状态,但是状态又比较少的情况。
缺点:
1,只能用于整形;
2,可读性差;
3,位图存储的元素个数虽然比一般做法多,但是存储的元素大小受限于存储空间的大小。位图存储性质:存储的元素个数等于元素的最大值。比如, 1K 字节内存,能存储 8K 个值大小上限为 8K 的元素。(元素值上限为 8K ,这个局限性很大!)比如,要存储值为 65535 的数,就必须要 65535/8=8K 字节的内存。要就导致了位图法根本不适合存 unsigned int 类型的数(大约需要 2^32/8=5 亿字节的内存)。
4,位图对有符号类型数据的存储,需要 2 位来表示一个有符号元素。这会让位图能存储的元素个数,元素值大小上限减半。 比如 8K 字节内存空间存储 short 类型数据只能存 8K*4=32K 个,元素值大小范围为 -32K~32K

应用:
1,给定100亿个整数,找出其中只出现过一次的整数; (1G:10亿字节,所以存放需要320G)
思路:将100一个数拆成1000份,再将每份使用位图,使用两位bit表示数字出现的次数(00:没出现过的数,01:出现一次的数,10:出现多次的数),再讲次数为1的合并到一个文件即可。
2,给两个分别有100亿个整数的文件,但是内存只有1G,找出两文件的并集;
思路:1,暴力求解O(N);2,排序+遍历O(NlgN);3,布隆过滤器(哈希+位图);4,哈希切分
3,一个没有排过序,有40亿个不相同的无符号整数,如何在其中快速判断是否有一个给定的值;
4,使用位图法进行整型数组排序。
思路:遍历数组找到max,min。根据这两个值缩小位图范围,注意对于int的负数转换为无符号整数,且取位时数字减去最小值。
实现:

class BitMap
{
public:
    BitMap()
    {}
    BitMap(size_t size)
    {
        _table.resize((size >> 5) + 1);
    }
    void Set(int data)   //置1
    {
        size_t ByteNo = data >> 5;        //数组中的那个元素
        size_t BitNo = data % 32;         //32位bit位的那个bit位
        _table[ByteNo] |= (1 << BitNo);   //置1
    }
    void ReSet(int data)   //置0
    {
        size_t ByteNo = data >> 5;
        size_t BitNo = data%32;
        _table[ByteNo] &= ~(1 << BitNo);
    }
    bool IsIn(int data)
    {
        size_t ByteNo = data >>5;
        size_t BitNo = data%32;
        if(_table[ByteNo]&(1 << BitNo))
            return true;
        return false;
    }
private:
    vector<int> _table; 
}
0; } ``` 程序运行时,会显示一个菜单,让用户选择不同的功能,例如: ``` 1位图索引(Bitmap Index)是一种特殊类型的索引,它使用位图存储数据。对于列的每个不同值,位图索引都会创建一个位图,其每个位对应于表的. 添加学生信息 2. 显示所有学生信息 3. 按总分排序 4. 按DataStructure成绩排序一行。如果值出现在行,则相应的位设置为1,否则为0。通过使用位图索 5. 按C成绩排序 6. 查找某一C成绩的记录 0. 退出程序 请选择操作引,可以快速地定位符合特定查询条件的行。 位图索引通常用于低基数(即不同值数量较少)列上,例如性别列等。在这种情况下,位图索引可以(输入数字): ``` 用户可以根据需要选择不同的功能,程序会根据用户的选择执行相应极大地减少磁盘 I/O 操作,提高查询性能。但是,如果列具有高基数(即的操作,例如: ``` 请输入学号:001 请输入姓名:张三 请输入DataStructure成绩:90 请输入不同值数量较多),则位图索引的效率可能会降低。 在 Oracle 数据库,可以使用 CREATEC成绩:80 添加成功 请选择操作(输入数字):2 学号 姓名 DataStructure C 总分 BITMAP INDEX 语句创建位图索引,例如: ``` CREATE BITMAP INDEX idx_gender ON employees(gender); ``` 001 张三 90.0 80.0 170.0 请选择操作(输入数字):3 按总这将在 employees 表的 gender 列上创建一个位图索引。在查询使用位图索引时,可以使用 BIT分排序结果: 学号 姓名 DataStructure C 总分 001 张三 90.0 80.0 MAP AND、BITMAP OR、BITMAP NOT 等操作符组合多个位图索引,以获得更高效的查询性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值