关键点位图算法及其应用场景。位图算法的优化实现。位图算法的概述是指用一个位来表示数据的状态。通常用于海量数据去重、海量数据计算、判断海量数据中是否存在某条数据等场景。以海量数据中是否存在某条数据的应用场景为例,假设用16位分别表示数字0-15。该位的值表示该数是否存在,0表示不存在,1表示存在。如上图所示,在这个数据集中,有元素1、2、6、10、11、13。可以发现,在数据比较密集的情况下,位图算法可以节省存储空间。如图所示,使用2个字节就可以表示16个数,同时可以判断是否有某个数,大大提高了计算速度。但是,当数据稀疏时,存储空间会在一定程度上被浪费。在位图算法中,位图空间的大小是固定的,不会根据存储数据的大小而改变。因此,当位图空间存储的数据量较少时,有大量位图空间空闲,造成很大的浪费。算法实现位图算法在主流开发语言中都有相应的实现。基本操作主要有写入、查询、删除、交集、并集等,下面通过一个例子来理解位图算法的实现。位图结构定义示例使用char类型数组存储位图信息(一般实现中使用长整型数组),一个char类型有8位。定义结构如下://为了简化问题,必须将LEN定义为CHAR_SIZE的倍数#defineLEN16#defineCHAR_SIZE8typedefcharBitSet[LEN/CHAR_SIZE];在某位写入数据时,先除以整数,计算出该位在数组中的第几位,然后用余数计算出char元素中的第几位。最后,通过或运算将相应位设置为1。//设置位位置voidset(BitSet&bits,intpos){//找到对应的数组下标intunit=pos/CHAR_SIZE;//查找字节中的位intp=pos%CHAR_SIZE;//通过and操作实现对应的bit位1bits[unit]=bits[unit]|(0x1<
0?1:0;}删除先找到对应的位置,然后通过AND运算清除该位置。//清除位voidclear(BitSet&bits,intpos){//找到对应的数组下标intunit=pos/CHAR_SIZE;//查找字节中的位intp=pos%CHAR_SIZE;//通过and运算实现对应的位位置1bits[unit]=bits[unit]&(~(0x1<