位图的简易实现及相关面试题
来源:互联网 发布:发型 知乎 编辑:程序博客网 时间:2024/06/08 14:59
概述
位图(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
- 位图的简易实现及相关面试题
- 位图的实现及相关问题
- 面试题之位图及其相关操作
- spring的相关面试题及答案
- 单链表及相关面试题
- 单链表及相关面试题
- sql 相关的查询面试题收集及答案
- Hibernate框架的相关知识点及面试题
- View的实现和优化相关面试题
- Handler相关的面试题
- 数组相关的面试题
- .NET相关的面试题
- 随机数的相关面试题
- String相关的面试题
- EJB相关的面试题
- Activity相关的面试题
- 单链表的相关面试题
- Handler相关的面试题
- java中的==和equals
- 使用注解方式调用自定义拦截器
- Centos7与Fedora24安装mysql后无法启动,提示 Unit mysql.service failed to load:No such file or directory
- 【学习Python】第二天
- Git 提交历史记录
- 位图的简易实现及相关面试题
- JavaScript学习记录--实现敏感词过滤
- git初体验
- Mybaits中遇到的问题
- Centos7下安装php-redis扩展及简单使用
- 将N个字符的数组,循环右移K位。时间复杂度O(N)
- 1---LeetCode【Two Sum】|C语言|总结
- 菜鸟先飞之JAVA_StringBuffer类
- windows常用快捷键