用位向量实现集合----适合小整数的排序

#pragma once #include <assert.h> #include <iostream> using namespace std; const int DefaultSize=50; template<typename T> class bitSet//集合的成员必须互不相同 { //用位向量来存储集合元素, 集合元素的范围在0到setSize-1之间。数组采用16位无符号短整数实现 public: bitSet(int sz=DefaultSize):setSize(sz) { assert(setSize>0); vectorSize=(setSize+15)/16;//数组元素最大个数 bitVector=new unsigned short[vectorSize]; assert(bitVector); for(int i=0;i<vectorSize;i++) bitVector[i]=0; } bitSet(const bitSet<T> &R) { setSize=R.setSize ; vectorSize=R.vectorSize ; bitVector=new unsigned short[vectorSize]; assert(bitVector); for(int i=0;i<vectorSize;i++) bitVector[i]=R.bitVector [i]; } ~bitSet(){delete bitVector;} bitSet<T> & operator =(const bitSet<T> &R) { setSize=R.setSize ; vectorSize=R.vectorSize ; bitVector=new unsigned short[vectorSize]; assert(bitVector); for(int i=0;i<vectorSize;i++) bitVector[i]=R.bitVector [i]; return *this; } friend istream & operator>>(istream & in,bitSet<T> & R)//输入集合 { cout<<endl<<"input the number of set:"; int n,value; in>>n; cout<<"input the value of set:"; for(int i=0;i<n;i++) { in>>value; R.addMember(value); } return in; } friend ostream & operator<<(ostream & out,bitSet<T> & R)//输出集合 { out<<"output set:";//输出集合(十进制) out<<"{"; assert(R.bitVector); for(int i=0;i<R.vectorSize;i++) { unsigned short elem=R.bitVector[i]; for(int j=0;j<16;j++) { unsigned short temp=elem>>(15-j); if(temp & 1) out<<i*16+j<<" ";//只显示非0的数组元素 } } out<<"}"; out<<endl; out<<"output bitset:"<<endl;//输出集合(二进制) out<<"{"; for(int i=0;i<R.vectorSize;i++) { unsigned short elem=R.bitVector[i]; for(int j=0;j<16;j++) { unsigned short temp=elem>>(15-j); out<<(temp & 1); } out<<" "; } out<<"}"; out<<endl; return out; } unsigned short getMember(const T x)//判断x是否在这个集合中 { int ad=x/16;//数组下标 int id=x%16;//二进制位置(从高位起) unsigned short elem=bitVector[ad];//取x所在数组元素 unsigned short temp=elem>>(15-id); return temp%2;//取第id位值(0/1) } void updateMember(const T x,unsigned short v)//v表示加入/删除 { //如v为1,将x加入集合;(如果x在集合中,操作无效果) //否则将x从集合中删除;(如果x不在集合中,操作无效果) int ad=x/16; int id=x%16; unsigned short elem=bitVector[ad]; unsigned short temp=elem>>(15-id); elem=elem<<(id+1); if(temp % 2==0 && v==1) temp=temp+1; else if(temp % 2==1 && v==0) temp=temp-1; temp=temp<<(15-id); elem=elem>>(id+1); bitVector[ad]=(temp | elem); } void addMember(const T x) { if(x<0 || x>=setSize) {cout<<"Warning:0<=value<setSize "<<endl;exit(1);} if(getMember(x)==0) updateMember(x,1); } void delMember(const T x) { if(x<0 || x>=setSize) {cout<<"Warning:0<=value<setSize "<<endl;exit(1);} if(getMember(x)==1) updateMember(x,0); } bitSet<T> &operator + (const bitSet<T> & R)//求两集合的并 { cout<<"union:"<<endl; assert(vectorSize==R.vectorSize ); for(int i=0;i<vectorSize;i++) bitVector [i]=bitVector[i] | R.bitVector [i];//按位求或 return *this; } bitSet<T> &operator * (const bitSet<T> & R)//求交 { cout<<"intersection:"<<endl; assert(vectorSize==R.vectorSize ); for(int i=0;i<vectorSize;i++) bitVector [i]=bitVector[i] & R.bitVector [i];//按位求与 return *this; } bitSet<T> &operator - (const bitSet<T> & R)//求差 { cout<<"difference:"<<endl; assert(vectorSize==R.vectorSize ); for(int i=0;i<vectorSize;i++) bitVector [i]=bitVector[i] & (!R.bitVector [i]); return *this; } private: //bitVector[i]的第j位为0/1表示第i*16+j个元素是否在此集合内。 //注:第x个元素存放在bitVector的第x/16个元素的(从高位起)第x%16位上。 int setSize;//集合大小(集合元素个数),一个数组元素最小包含0个集合元素,最大包含16个集合元素 int vectorSize;//位数组大小(存储数组大小) unsigned short *bitVector;//用位数组来存储集合元素(16位无符号短整数) }; 

 

原文链接: http://hi.baidu.com/huqingshuye/blog/item/4ab265520148856e84352440.html

你可能感兴趣的:(用位向量实现集合----适合小整数的排序)