[0 maxval]の範囲内のm個の整数のランダム秩序シーケンスを生成する.
7825 ワード
1は、容器setにより実現する.
2、配列で実現
3、チェーンテーブルで実現
4、二叉検索ツリーで実現
5ビットビットベクトルで実現する.
#include <iostream>
#include <set>
#include <ctime>
using namespace std ;
class IntSetSTL
{
public:
IntSetSTL(int max,int num){}
int size(){ return S.size(); }
void insert(int t){ S.insert(t); }
void report(int* v)
{
int i=0;
for(set<int>::iterator ite=S.begin();ite!=S.end();ite++)
v[i++]=*ite;
}
private:
set<int> S;
};
void generateSetSTL(int m,int maxVal)
{
int* v=new int[m];
IntSetSTL stl(maxVal,m);
while(stl.size()<m)
stl.insert(rand()%(1+maxVal));
stl.report(v);
for(int i=0;i<m;i++)
cout<<v[i]<<endl;
cout<<endl;
delete[] v;
}
int main ()
{
srand(time(0));
const int maxVal=100;
const int m=10;
generateSetSTL(m,maxVal);
return 0 ;
}
2、配列で実現
#include <iostream>
#include <ctime>
using namespace std ;
class IntSetArray
{
public:
IntSetArray(int maxVal,int m)
{
a=new int[m+1];
//
n=0;
a[0]=maxVal;
}
int size(){ return n; }
void insert(int t)
{
int i;
for(i=0;a[i]<t;i++)
;
if(a[i]==t)
return;
for(int j=size();j>=i;j--)
a[j+1]=a[j];
a[i]=t;
n++;
}
void report(int* v)
{
for(int i=0;i<size();i++)
v[i]=a[i];
}
private:
int* a;
int n;
};
void generateSetArray(int m,int maxVal)
{
int* v=new int[m];
IntSetArray array(maxVal,m);
while(array.size()<m)
array.insert(rand()%maxVal);
array.report(v);
for(int i=0;i<m;i++)
cout<<v[i]<<endl;
cout<<endl;
delete[] v;
}
int main ()
{
srand(time(0));
const int maxVal=100;
const int m=10;
generateSetArray(m,maxVal);
return 0 ;
}
3、チェーンテーブルで実現
#include <iostream>
#include <ctime>
using namespace std ;
struct Node
{
Node(int i,Node* p):val(i),next(p){}
int val;
Node* next;
};
class IntSetList
{
public:
IntSetList(int maxVal,int m)
{
sentinel=head=new Node(maxVal,NULL);
n=0;
}
int size(){ return n; }
void insert(int t)
{
head=rinsert(head,t);
}
void report(int* v)
{
int i=0;
for(Node* p=head;p!=sentinel;p=p->next)
v[i++]=p->val;
}
private:
// nb
Node* rinsert(Node* p,int t)
{
if( t>(p->val) )
p->next=rinsert(p->next,t);
else if( t<(p->val) )
{
p=new Node(t,p);
n++;
}
return p;
}
Node* head;
//
Node* sentinel;
int n;
};
void generateSetList(int m,int maxVal)
{
int* v=new int[m];
IntSetList list(maxVal,m);
while(list.size()<m)
list.insert(rand()%maxVal);
list.report(v);
for(int i=0;i<m;i++)
cout<<v[i]<<endl;
cout<<endl;
delete[] v;
}
int main ()
{
srand(time(0));
const int maxVal=100;
const int m=10;
generateSetList(m,maxVal);
return 0 ;
}
4、二叉検索ツリーで実現
#include <iostream>
#include <ctime>
using namespace std ;
struct Node
{
Node(int i):val(i),lchild(NULL),rchild(NULL){}
int val;
Node* lchild;
Node* rchild;
};
class IntSetBST
{
public:
IntSetBST(int maxVal,int m):root(NULL),n(0){}
int size(){ return n; }
void insert(int t)
{
root=rinsert(root,t);
}
void report(int* x)
{
v=x;
vn=0;
traverse(root);
}
private:
// nb
Node* rinsert(Node* p,int t)
{
if(p==NULL)
{
p=new Node(t);
n++;
}
else if( t>(p->val) )
{
p->rchild=rinsert(p->rchild,t);
}
else if( t<(p->val) )
{
p->lchild=rinsert(p->lchild,t);
}
return p;
}
void traverse(Node* p)
{
if(p==NULL)
return;
traverse(p->lchild);
v[vn++]=p->val;
traverse(p->rchild);
}
Node* root;
int n;
int *v,vn;
};
void generateSetBST(int m,int maxVal)
{
int* v=new int[m];
IntSetBST bst(maxVal,m);
while(bst.size()<m)
bst.insert(rand()%maxVal);
bst.report(v);
for(int i=0;i<m;i++)
cout<<v[i]<<endl;
cout<<endl;
delete[] v;
}
int main ()
{
srand(time(0));
const int maxVal=100;
const int m=10;
generateSetBST(m,maxVal);
return 0 ;
}
5ビットビットベクトルで実現する.
#include <iostream>
#include <ctime>
using namespace std ;
class IntSetBitVector
{
public:
IntSetBitVector(int maxVal,int m):hi(maxVal),n(0),x(new int[maxVal/BITSPERWORD+1])
{
for(int i=0;i<hi;i++)
clear(i);
}
int size(){ return n; }
void insert(int t)
{
if(!test(t))
{
set(t);
n++;
}
}
void report(int* v)
{
int j=0;
for(int i=0;i<hi;i++)
{
if(test(i))
v[j++]=i;
}
}
private:
enum{ BITSPERWORD=32, SHIFT=5, MASK=0x1f};
void set(int i)
{
x[i>>SHIFT]|=(1<<(i&MASK));
}
void clear(int i)
{
x[i>>SHIFT]&=~( 1<<(i&MASK) );
}
int test(int i)
{
return x[i>>SHIFT]&(1<<(i&MASK));
}
int n,hi;
int* x;
};
void generateSetBitVector(int m,int maxVal)
{
int* v=new int[m];
IntSetBitVector bitVector(maxVal,m);
while(bitVector.size()<m)
bitVector.insert(rand()%maxVal);
bitVector.report(v);
for(int i=0;i<m;i++)
cout<<v[i]<<endl;
cout<<endl;
delete[] v;
}
int main ()
{
srand(time(0));
const int maxVal=100;
const int m=10;
generateSetBitVector(m,maxVal);
return 0 ;
}