位图的简易实现及相关面试题

概述
位图(bitmap)是一种非常常用的结构,在索引,数据压缩等方面有广泛应用。本文介绍了位图的实现方法及其应用场景。

位图的简易实现。

#pragma once
#include<iostream>
#include<vector>
using namespace std;

class BitMap
{
public:
    BitMap(int size)
    {
        _table.resize((size >> 5) + 1);//位图最大存储数据
    }

    void Set(const int& data)//存储该数据,将对应位置为1
    {
        size_t ByteNo = (data >> 5);
        size_t BitNo = data % 32;
        _table[ByteNo] |= (1 << BitNo);
    }
    void Reset(const int &data)//删除该数据,对应位置为0
    {
        size_t ByteNo = (data >> 5);
        size_t BitNo = data % 32;
        _table[ByteNo] &= ~(1 << BitNo);
    }

    bool Test(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;
};

以下三个问题都是位图相关类似题目:

1)给定100亿个整数,设计算法找到只出现一次的整数

使用hash将所有整数映射到1000个文件中,在每个文件中使用 bitmap,用两个bit表示出现次数,00表示没出现过,01表示出现过1次,10表示出现过多次,11舍弃,最后归并每个文件中出现只有1次的数即为所求。

2)给两个文件,分别有100亿个整数,我们只有1G内存,如何找到两个文件交集

使用hash函数将第一个文件的所有整数映射到1000个文件中,每个文件有1000万个整数,大约40M内存,
内存可以放下,把1000个文件记为 a1,a2,a3…..a1000,用同样的hash函数映射第二个文件到1000个文件中,这1000个文件记为b1,b2,b3……b1000,由于使用的是相同的hash函数,所以两个文件中一样的数字会被分配到文件下标一致的文件中,分别对a1和b1求交集,a2和b2求交集,ai和bi求交集,最后将结果汇总,即为两个文件的交集

3)1个文件有100亿个int,1G内存,设计算法找到出现次数不超过2次的所有整数

首先要知道所有的int也就是42亿9000万多。所以这样我们也就需要这么些位来使用位图,使用两位位图,每两个位表示一个状态。对于42亿9000万多的位我们需要512M来存储,所以对于两位我们需要1G来存储,然后找到对应状态的数,统计出来就好了。

类似面试题相关链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一些与Redis相关的常见面试题及其答案: 1. Redis是什么?它的特点是什么? 答:Redis是一种开源的内存数据存储系统,它支持键值对的存储。其特点包括高性能、持久化、支持多种数据结构、分布式和高可用性等。 2. Redis支持哪些数据结构? 答:Redis支持多种数据结构,包括字符串(String)、哈希(Hash)、列表(List)、集合(Set)、有序集合(Sorted Set)和位图(Bitmap)等。 3. Redis的持久化机制有哪些? 答:Redis支持两种持久化机制:RDB(Redis Database)和AOF(Append Only File)。RDB是通过将内存中的数据快照保存到磁盘上的二进制文件,而AOF是通过将每个写操作追加到文件末尾来记录数据变化。 4. Redis的缓存淘汰策略有哪些? 答:Redis提供了多种缓存淘汰策略,包括LRU(Least Recently Used,最近最少使用)、LFU(Least Frequently Used,最不经常使用)、Random(随机替换)和TTL(Time To Live,过期时间)等。 5. Redis如何实现分布式? 答:Redis可以通过主从复制(Master-Slave Replication)和哨兵(Sentinel)来实现分布式。主从复制通过将主节点的数据复制到从节点上来实现数据的分布式存储,而哨兵则用于监控和管理Redis集群的高可用性。 6. Redis与Memcached的区别是什么? 答:Redis和Memcached都是内存数据存储系统,但两者有一些区别。Redis支持更多的数据结构,提供了更丰富的功能;Redis支持持久化,而Memcached不支持;Redis有更好的高可用性和分布式支持;Redis支持更多的编程语言客户端等。 7. 如何保证Redis的并发安全性? 答:Redis本身是单线程的,通过使用事件驱动机制和非阻塞IO来实现高并发。此外,Redis提供了事务和乐观锁等机制来保证并发安全性。 8. Redis的内存淘汰策略是如何工作的? 答:当Redis内存使用达到上限时,根据配置的内存淘汰策略,Redis会删除一些已有的键值对来释放内存空间。不同的策略会根据不同的规则选择要删除的键值对。 这些问题涵盖了Redis的基本概念、特点、数据结构、持久化、分布式和并发安全性等方面。在面试前,建议对Redis的原理和常用命令有一定的了解,并准备一些实际的应用场景以展示自己的经验和能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值