,哈希在很多方面都有着其特殊的作用,今天我们来介绍两种关于哈希的应用方面,对于大数据的处理。
第一 位图
如果说,要在4000亿的无符号整型中,找存在的那个数,该如何处理呢,明显是key的模型,找一个数是否存在,但是内存不够啊,1G是10亿的数据,那么4000亿的话是400G,还要有整形4个字节,总来说要1600G,服务器能有这么大吗?
肯定是有这么大的服务器的,但是呢不能全去处理这个数据吧,因此对于大数据的处理,对于空间的要求就比较的高了,我们一方面要考虑数据的查找效率,还有空间的储存可能。
因此根据哈希的变形,有了位图这种数据结构,原理思想是什么呢?
首先我们只需要知道这个数据在不在,那么就有这么个思想,我们可以选择位来表示状态,来说明数在不在,我们不必要用过多的属性去描述这个数据。因此位图的思想是,用位来表示其数的存在性,来判别。
其实我们可以去思考,越有特性的数其实相对于来说描述其更加容易,所以才在一个数据的属性很少时,我们就可以使用相对小的空间来描述它,哈希就是描述的方式,而无符号整形相对来说特性很高,所以很好描述。
那用位来控制,就是定义一个整型来控制,除32表示第几个整型,膜32表示第几位表示这个数。而查找的时候反向找就可以找到,因为是一一对应的,所以一个位一定能表示一个数。因此如果要寻找,那么只需要500M就能表示全部的无符号整型,具体的实现看代码吧~
#pragma once
#include <vector>
namespace whc
{
class bitset
{
public:
bitset(size_t N)
{
_bits.resize(N / 32 + 1, 0);
_num = 0;
}
void set(size_t x)
{
size_t index = x / 32;
size_t pos = x % 32;
_bits[index] |= (1 << pos);
_num++;
}
void reset(size_t x)
{
size_t index = x / 32;
size_t pos = x % 32;
_bits[index] &= ~(1 << pos);
_num--;
}
bool test(size_t x)
{
size_t index = x / 32;
size_t pos = x % 32;
return _bits[index] &= (1 << pos);
}
private:
std::vector<int> _bits;
size_t _num;
};
}
位图的实现不难,主要用于对位操作符的应用,但其思想,却是很重要的,对于不同的属性数据,用较小的空间来描述他的属性便可以,不用一定需要将它的所有属性描述出来~因为位图具有很多的变型使用。