您的位置:首页 > 编程语言 > C语言/C++

位图法排序

2015-11-29 16:50 393 查看
位图法:bitmap,就是用每一位来存放某种状态,适用于大规模数据,但数据状态又不是很多的情况。通常是用来判断某个数据存不存在的。

对unsigned没有重复的数字进行排序,假设我们要对0-7内的5个元素(4,7,2,5,3)排序。那么我们就可以采用Bit-map的方法来达到排序的目的。要表示8个数,我们就只需要8个Bit(1Bytes),首先我们开辟1Byte的空间,将这些空间的所有Bit位都置为0,如下图:



然后遍历这5个元素,首先第一个元素是4,那么就把4对应的位置为1(可以这样操作:p+(i/8)|(0x01<<(i%8))当然了这里的操作涉及到Big-ending和Little-ending的情况,这里默认为Big-ending),因为是从零开始的,所以要把第五位置为一(如下图):



接着再处理第二个元素7,将第八位置为1,,接着再处理第三个元素,一直到最后处理完所有的元素,将相应的位置为1,这时候的内存的Bit位的状态如下:



最后我们现在遍历一遍Bit区域,将该位是一的位的编号输出(2,3,4,5,7),这样就达到了排序的目的。

这样只需要开辟8个Bit(1Bytes)就可以记录每个数据并达到排序的目的。

先做个测试:

#include<iostream>
#include<bitset>

using namespace std;

#define i 1024

int main()
{
bitset<i> bit;

int a[i]={0};

cout<<sizeof(bit)<<endl;
cout<<sizeof(a)<<endl;

system("pause");
return 0;
}


存储1024个数据,数组占用了4096个字节,而bitset只需要128个字节即可。

下面介绍位图法对不重复unsigned int 数的排序。

产生不重复unsigned int 数据请参考:产生数据

#include<iostream>
#include<fstream>
#include<bitset>
#include<ctime>

using namespace std;

const unsigned int max_num=20000;//数字最大
const unsigned int max_count=10000;//数据个数

int main()
{
bitset<max_num+1> bit;
int tmp=0;

//以下读取磁盘文件中的数据
ifstream in_ran;
in_ran.open("F:\\gz\\random.txt",ios::in|ios::_Nocreate);

if(in_ran.fail())
{
cout<<"打开文件失败!"<<endl;
exit(1);
}

for(int i=0;i<max_count;i++)
{
in_ran>>tmp; //从文件中读取数据
bit.set(tmp,1);//从磁盘文件读取100个整数,顺序存放在a数组中
}
in_ran.close();

//以下向磁盘文件写入数据--排序后的数据
ofstream out_sort;
out_sort.open("F:\\gz\\random_sort.txt",ios::out);

if(out_sort.fail())
{
cout<<"打开文件失败!"<<endl;
exit(1);
}

for(int j=0;j<max_num;j++)//输出排序后的随机数
{
if(bit[j]==1)
{
out_sort<<j<<" ";
}
}
out_sort.close();

system("pause");
return 0;
}

与以往排序:先将读取的数据储存在数组中,然后在进行排序相比,此排序方法没有中间数组作为传递,而且只须查询遍历一次数据即可得出排序后的结果。特别适用于无重复的整数排序。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ bitset 位图