位图的应用实践
实验二进阶实验 位图的应用实践
【实验目的】
1.掌握位图的数据结构定义以及相关操作和应用;
2.根据掌握的基本知识,实现位图的一个相关应用。
【实验要求】
实验问题:
给定 100000 个不重复的 unsigned int 的整数,这些数据是无序的。然后再给出一个数,如何快速判断这个数是否在那 100000 个数当中?
实验思路:
使用 bitmap:将这 100000 个数字存储到 bitmap 中,然后对于给出的数,判断是否在bitmap 中即可。
实现源码:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <fstream>
using namespace std;
//根据文件中的数据生成一个整形数组用来存储位图
int* generateBitMap(int* bitMap, int minValue, int maxValue)
{
//文件中整数个数
int size,itemCount=maxValue-minValue+1;
//计算整型数组的大小
if(itemCount%32==0)
{
size=itemCount/32;
}
else
{
size=itemCount/32+1;
}
//请内存空间并将数组初始化为0
bitMap=(int*)malloc(sizeof(int)*size);
if(bitMap==NULL)
{
perror("Out Of Memory when malloc space!");
}
else
{
//将bitMap数组初始化为全零
memset(bitMap,0,size*sizeof(int));
}
return bitMap;
}
//根据用户输入的数据信息将该数据在位图上的相应位置置1
void setBitMap(int* bitMap,int value,int minValue)
{
//计算value在bitMap数组中的下标及在int类型中的偏移大小
int index=(value-minValue)/32;
int offset=(value-minValue)%32;
int temp=1;
//将int类型整数的offset位置置为1
for(int i=0;i<offset;i++)
{
temp<<=1;
}
//将bitMap数组中value所在位置置为1
int a=(bitMap[index]|temp);
bitMap[index]=a;
}
//查找数字value在位图
int findInBitMap(int* bitMap,int value,int minValue)
{
//计算value在bitMap数组中的下标及在int类型中的偏移大小
int index=(value-minValue)/32;
int offset=(value-minValue)%32;
//将int类型整数的offset位置置为1
int temp=1;
for(int i=0;i<offset;i++)
{
temp=temp<<1;
}
//将bitMap数组中value所在位置是否为1的结果返回
int pos=bitMap[index]&temp;
return pos;
}
int main()
{
int *bitMap=NULL,index,valValue=12345;
int x,count=0,maxValue = 0,minValue=1000000;
//以文本模式打开in.txt备读
ifstream srcFile("data.txt",ios::in);
if(!srcFile)
{ //打开失败
cout << "error opening source file." << endl;
return 0;
}
//得到文件中数据的最大值和最小值
while(srcFile >> x)
{
if(x>maxValue)
{
maxValue=x;
}
if(x<minValue)
{
minValue=x;
}
}
//将文件指针设定到文件开头
srcFile.clear();
srcFile.seekg(0);
bitMap=generateBitMap(bitMap, minValue, maxValue);
while(srcFile >> x) //可以像用cin那样用ifstream对象
{
setBitMap(bitMap,x,minValue);
}
srcFile.close();
//查找valValue是否包含在文件中
int result=findInBitMap(bitMap,valValue,minValue);
if(result)
{
cout<<valValue<<" in file !"<<endl;
}
else
{
cout<<valValue<<" not in file !"<<endl;
}
return 0;
}
程序流程图:

实验结果:
存储空间和效率:
本实验采用位图的方式表示一个数是否出现在文件中,相比较于将数据直接加载到内存进行判断的方式,该方法在存储空间上更具优势。由于数据元素个数与数据最大值和最小值之差比较接近,故位图存储空间利用率较高。当查询一个数是否在文件中出现过时,可以在常数时间内完成,故该方法具有较高的时间和空间利用率。

浙公网安备 33010602011771号