Pagini recente » Cod sursa (job #373843) | Cod sursa (job #2286767) | Cod sursa (job #2578294) | Cod sursa (job #55117) | Cod sursa (job #917876)
Cod sursa(job #917876)
#include <fstream>
#include <iostream>
#include <ctime>
#include <stdlib.h>
#define prim2 251003
#define prim1 350107
#define sizet1 670000
#define sizet2 400000
#define maxim 1000000
using namespace std;
class CuckooHash
{
private:
int random1,random2,nr;
int *T1,*T2;
int *ope;
int *values;
int h1(int, int);
void rehash();
public :
CuckooHash();
bool adauga(int x);
int cauta(int x);
bool sterge (int x);
};
CuckooHash::CuckooHash()
{
nr=0;
srand(time(NULL));
random1=prim1 +rand() % (sizet1-prim1);
random2=prim2 +rand() % (sizet2-prim2);
T1= new int[sizet1+2];
T2= new int[sizet2+2];
ope=new int[maxim];
values=new int[maxim];
}
int CuckooHash:: h1(int value,int random)
{
return value %random;
}
void CuckooHash::rehash()
{
delete T1;
delete T2;
random1=prim1 +rand() % (sizet1-prim1);
random2=prim2 +rand() % (sizet2-prim2);
T1=new int[sizet1+2];
T2=new int[sizet2+2];
for (int i=0;i<nr;i++)
{
if (ope[i]==true)
adauga(values[i]);
else
sterge(values[i]);
}
}
int CuckooHash:: cauta(int value)
{
int hash1=h1(value,random1);
int hash2=h1(value,random2);
if (T1[hash1]==value || T2[hash2]==value) return 1;
else return 0;
}
bool CuckooHash::sterge(int value)
{
ope[nr]=false;
values[nr++]=value;
int hash1=h1(value,random1);
int hash2=h1(value,random2);
if (T1[hash1]==value)
{ cout<<hash1<<' '<<hash2<<endl;
T1[hash1]=0;
cout<<T1[hash1]<<' ';
return true;
}
if (T2[hash2]==value)
{
T2[hash2]=0;
return true;
}
return false;
}
bool CuckooHash::adauga(int value)
{
ope[nr]=true;
values[nr++]=value;
int aux;
bool ok=false;
int hash1 = h1(value,random1);
int hash2 = h1(value,random2);
if (cauta(value)==0)
{
for(int i=1;i<=50;i++)
{
if(T1[hash1]==0)
{
T1[hash1]=value;
return true;
}
else
if(T2[hash2]==0)
{
T2[hash2]=value;
return true;
}
else
{
aux=T2[hash2];
T2[hash2]=value;
value=aux;
}
}
if (ok==false)
rehash();
}
}
int main()
{ int n;
ifstream in("hashuri.in");
ofstream out("hashuri.out");
in>>n;
CuckooHash Hashul;
for (int i=0;i<n;i++)
{
int op,val;
in>>op>>val;
switch(op)
{
case 1: Hashul.adauga(val);
break;
case 2: Hashul.sterge(val);
break;
case 3: out<<Hashul.cauta(val)<<'\n';
break;
}
}
return 0;
}