位图操作宏定义先列出来
/* 位图属性变量 */
#define BITMAP_STEP(bitMapType) (sizeof(bitMapType) * 8)
#define BITMAP_STEPNUM(uiMaxKey, step) ((uiMaxKey + step -1) / step)
#define BITMAP_BITNUM(uiMaxKey, step) (((uiMaxKey + step - 1) / step) * step)
/* 增加key到BitMap */
#define ADD_KEY(key, map, step) (map[uiKey/uiStep] |= (1 << (key% step)))
#define ADD_KEY_SHIFT(key,map,step,shift) (map[key>>shift] |= (1<<(key&(step-1))))
/* 删除key从BitMap */
#define DEL_KEY(key, map, step) (pBitMap[key / step] &= (~(1 << (key % step))))
#define DEL_KEY_SHIFT(key,map, step,shift) (map[key>>shift] &= (~(1<<(key&(step- 1)))))
/* 查询key是否在BitMap中 */
#define KEY_EXIST(key, map, step) (map[key / step] & (1 << (key % step)))
#define KEY_EXIST_SHIFT(key,map,step,shift) (map[key>>shift] & (1 << (key & (step- 1))))
正文:
BitMap就是位图, BitMap是个好数据结构, 尤其对大数据行业,搞清楚其原理后,会发现位图很easy.
先给出两个假设
(1)--->假设要处理的都是正整数,(负整数也可以搞定,做下特殊处理就可以,此文章忽略)
(2)--->假设申请位图内存类型为unsigned int
1.BitMap的bit总数有什么决定
bit总数由最大数N确定,而和数队列的长度无关!
比如队列:
que1 = {1,2,3,4,5,6,5,4,3,2,1,2,2,10,3,4,5,6,7,8,6,5,4,3,2,1}
que2= {1,1024}
que1