BitSet位图
来源:互联网 发布:培训机构程序员 编辑:程序博客网 时间:2024/06/06 07:06
存储空间的计算
1int为4个字节(byte)
1byte为8个 比特位(bit)
1kb = 1024 byte
1Mb = 1024 kb
1Gb = 1024Mb
1Tb = 1024Gb
位图
腾讯题:给40亿个不重复的无符号整型,没排过序。如何快速判断这个数存不存在?
如果内存允许,可以先进行排序,再用二分查找进行查找。但是40亿个无符号整型存储在内存中需要16G。
如果用位图40亿个整型需要内存为500M。
位图是一个数组的每一个数据的每一个二进制位表示一个数据,0表示数据不存在,1表示数据存在。
代码:
"BitSet.h"#pragma once#include <vector>class BitSet{public: BitSet(size_t range)//构造函数 { _a.resize((range >> 5) + 1, 0); } void Set(size_t num) { size_t index = num >> 5;//在哪个数中 size_t pos = num % 32;//在哪个比特位中 _a[index] |= (1 << pos);//将num对应的位置1 } void ReSet(size_t num) { size_t index = num >> 5; size_t pos = num % 32; _a[index] &= ~(1 << pos);//将num对应的位置0 } bool Test(size_t num)//测试 { size_t index = num >> 5; size_t pos = num % 32; return _a[index] & (1 << pos);//如果存在,对应的位是1,&1为1,否则相反 }protected: vector<int> _a;};void TestBitSet(){ BitSet s1(-1); s1.Set(1); cout << "BitSet?:" << s1.Test(1) << endl; s1.Set(33); cout << "BitSet?:" << s1.Test(33) << endl; s1.Set(67); cout << "BitSet?:" << s1.Test(67) << endl; s1.ReSet(1); cout << "BitSet?:" << s1.Test(1) << endl; s1.ReSet(33); cout << "BitSet?:" << s1.Test(33) << endl; s1.ReSet(67); cout << "BitSet?:" << s1.Test(67) << endl;}"Test.cpp"#include <iostream>using namespace std;#include "BitSet.h"int main(){ TestBitSet(); return 0;}
0 0
- BitSet位图
- 位图 bitset
- c++位图之bitset
- golang实现位图(BitSet)
- c++ stl bitset 位图操作
- 【位图】STL中bitset的使用
- bitset
- bitset
- BitSet
- bitset
- bitset
- BitSet
- bitset
- bitset
- bitset
- bitset
- bitset
- BitSet
- C# 各关键字作用
- 项目范围管理·七
- JAVA多线程一
- Lookup 组件用法全解
- Spring JdbcTemplate详解
- BitSet位图
- 使用ScrollView属性fillViewport解决android布局不能撑满全屏的问题
- socket编程
- 结构对齐--__packed与#pragma pack
- Cannot instantiate the type HttpClient问题
- 设计的一个适合小团队小项目的git工作流
- 如何使用Hexo建立自己的Github Pages博客
- spring中的AOP
- cxf-spring-pratice-client