位图的应用实践

实验二进阶实验 位图的应用实践

【实验目的】

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;
} 

程序流程图:

![img](file:///C:\Users\Administrator\AppData\Roaming\Tencent\Users\2582974511\TIM\WinTemp\RichOle\M2GG57PSRQ6[LMUCKU]MC.png)

实验结果:

QQ图片20201201212907

存储空间和效率:

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

posted @ 2020-12-09 00:42  Coulson123  阅读(115)  评论(0)    收藏  举报