位图
用来快速判断一个整数是否在一堆整数中
二进制用0和1来表示数据,位图根据0和1来存储对应的数据,可以大大节省存储空间,并具备排序特性。
例如数组:int arr[ ] = {1,31,53,41,79,201}
创建字符数组 int bitmap[26](因为数字最大数201,26 * 8=208 < 201)
遍历字符数组的每一位,设置 0 或者 1
通过设置 0 或者 1 来判断这个值是否存在。1表示存在
比如:31
因为(3*8 + 7 = 31)
则需要对 bitmap[3] 的第 7 位设置为 1
位图的基本操作
/*================================================================
# File Name: bitmap.h
# Author: rjm
# mail: rjm96@foxmail.com
# Created Time: 2018年05月22日 星期二 16时30分58秒
================================================================*/
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>
#include <string.h>
#define TEST_HEAD printf("\n=======================%s==================\n",
__FUNCTION__)
typedef uint64_t BitmapType;
typedef struct Bitmap {
BitmapType* data; // 数组
uint64_t capacity; // 需要表示的位数
// 例如:要表示100位
// 需要的数组元素个数为
// (100 / (sizeof(uint64_t)*8)) + 1
// 即为 2 个元素
} Bitmap;
// 初始化
void BitmapInit(Bitmap* bm, uint64_t bits);
// 给某一位设置为 1
void BitmapSet(Bitmap* bm, uint64_t bits);
// 给某一位设置为 1
void BitmapUnset(Bitmap* bm, uint64_t bits);
// 给所有位设置为 1
void BitmapAllSet(Bitmap* bm);
// 给所有位设置为 0
void BitmapAllUnset(Bitmap* bm);
// 测试某一位是否为 1
uint64_t BitmapTest(Bitmap* bm, uint64_t bits);
// 销毁
void BitmapDestroy(Bitmap* bm);
/*================================================================
# File Name: bitmap.c
# Author: rjm
# mail: rjm96@foxmail.com
# Created Time: 2018年05月22日 星期二 16时30分48秒
================================================================*/
#include "bitmap.h"
uint64_t DataSize(uint64_t capacity)
{
return capacity / (sizeof(BitmapType)*8) + 1;
}
// 初始化
void BitmapInit(Bitmap* bm, uint64_t bits)
{
if(bm == NULL)
return ;
bm->capacity = bits;
uint64_t size = DataSize(bm->capacity);
bm->data = (BitmapType*)malloc(sizeof(BitmapType)*size);
memset(bm->data, 0x0, sizeof(BitmapType)*size);
}
// 给某一位设置为 1
void BitmapSet(Bitmap* bm, uint64_t bits)
{
if(bm == NULL)
return ;
// 例如设置第 50 位为 1, 那么元素下标为 index

本文介绍了位图和布隆过滤器两种数据结构,位图利用二进制0和1存储数据,适用于快速判断整数是否存在;布隆过滤器结合哈希表与位图,用于高效判断字符串是否存在,尽管存在误识别率但空间效率高,常应用于URL去重、垃圾邮件过滤等场景。
最低0.47元/天 解锁文章
711

被折叠的 条评论
为什么被折叠?



