首先介绍一下大数据处理常用技巧Bitmap
Bitmap算法又叫位图算法
位图是在内存中连续的二进制位(bit ),这种方法对于大数据的处理应用很广。
举个例子:
给定长度为10的bitmap,每一个bit位分别对应着从1到9的10个整数,此时bitmap的所有位都是0。
把整形数3存入Bitmap中,对应存储位置的下标为3的位置,将bit置为1
有整形数5、6存入也一样,分别将对应位置的下标置为1
位图法几大优势:
1、不仅方便查询,还可以去掉重复的整形数。
2、用Bitmap还可以做位运算,按位& | ~,提高工作效率
3、节省存储空间,8位才占一个字节,如果用的hashset或者hashmap,同样的情况就要存储成int,占4个字节既32bits,而在Bitmap中只占1bit,内存节省了32倍。
实际处理大数据的时候可以用到C++标准库STL中的特殊容器bitset
bitset<bits>::bitset() //默认构造函数,生成一个bitset,所有值初始化为0
bitset<50> flags;
bitset<bits>::bitset(unsigned long value)
//产生一个bitset,以整数值value的二进制位作为初值
//如果value的值太小,前面不足的位被设为0
bitset<50> flags(7);
explicit bitset<bits>::bitset (const string& str)
bitset<bits>::bitset (const string& str, string::size_type str_idx)
bitset<bits>::bitset (const string& str, string::size_type str_idx, string::size_type str_num)
/*以上所有形式都用来初始化bitset,以字符串str或其子串加以初始化。
该字符串或者子串中只能包含字符'0'和'1'
str_idx是str中用来初始化的第一个字符
如果省略str_num,从str_idx到str结束的所有字符都将用于初始化
若字符串中字符数量少于所需,前面多余的位置将被设为初值0
若字符串中字符数量多于所需,后面多余的位置将被忽略
如果str_idx>str.size(),抛出out_of_range异常
如果有字符非'0'非'1',抛出invalid_argument异常*/
bitset<50> flags(string("1010101"));
bitset<50> flags(string("1111000"),2,3);
size_t bitset<bits>::size() const //返回位的个数
size_t bitset<bits>::count() const //返回“位值为1”的位个数
bool bitset<bits>::any() const //判断是否有任何位被设为1,有1返回true
bool bitset<bits>::none() const //判断是否所有位被设为0,全0返回true
bool bitset<bits>::test(size_t idx) const //判断idx位置上的位是否被设为1
bool bitset<bits>::operator == (const bitset<bits>& bits) const //判断*this和bits的所有位是否相等
bool bitset<bits>::operator != (const bitset<bits>& bits) const//判断*this和bits中是否有些位不相等
bitset<bits>& bitset<bits>::reset()//将所有位设为false(0)
bitset<bits>& bitset<bits>::reset(size_t idx)//将位置idx上的位设为false(0)
bitset<bits>& bitset<bits>::flip()//反转所有位
bitset<bits>& bitset<bits>::flip(size_t idx)//反转位置idx上的位
bitset<bits>& bitset<bits>::operator ^= (const bitset<bits>& bits)//对每个位逐一进行异或运算,将*this中所有
bitset<bits>& bitset<bits>::operator |= (const bitset<bits>& bits)//对每个位逐一进行或运算
bitset<bits>& bitset<bits>::operator &= (const bitset<bits>& bits)//对每个位逐一进行与运算
bitset<bits>& bitset<bits>::operator <<= (size_t num)//将所有位向左移动num个位置,空出来的位设为false(0)
bitset<bits>& bitset<bits>::operator >>= (size_t num)//将所有位向右移动num个位置,空出来的位设为false(0)
部分测试:
运行结果
有感兴趣的可以把具体方法粘贴回去,在编译器上跑了看看。。。