[哈希函数]
//1.第一种hash方法
typedef long long LL;
const int HashMax = 1000003;
LL Hash[HashMax];
//y,w为需要哈希的两个值
int MakeHash(int y, int w)
{
LL situ=(LL)y<<24|w;//定义哈希策略
LL big=situ%HashMax;
while( Hash[big]!=-1&&Hash[big]!=situ )
big=(big<<1|1)%HashMax;
if( Hash[big]==-1 )
Hash[big]=situ;
return big;
}
//2.邻接链表hash
#define H 21997
int next[H],head[H];
void insert(int i)
{
int key=(p[i].x*p[i].x+p[i].y*p[i].y)%H;
next[m]=head[key];
p[m].x=p[i].x;
p[m].y=p[i].y;
head[key]=m++;
}
int find(int x,int y)
{
int key=(x*x+y*y)%H;
register int i;
for(i=head[key];i!=-1;i=next[i])
if(p[i].x==x && p[i].y==y)
return i;
return -1;
}
//3.康托展开
int cantor( node a )
{
int ret=0;
bool flag[10]={false};
for( int i=0;i<9;i++ )
{
int k=a.eight[i];
flag[k]=true;
int p=0;
for( int j=1;j<k;j++ )
if( flag[j]==false )
p++;
ret+=p*fec[8-i];
}
return ret;
}
//4.
const int size=20345677;
int hash[size];
int sum[size];
const int key=1777;
const int MAX=1000000000;
void Insert(int num)
{
int temp=num;
num=(num+MAX)%size;
while( hash[num]!=MAX && hash[num]!=temp )
num=(key+num)%size;
hash[num]=temp;
sum[num]++;
}
int Find(int num)
{
int temp=num;
num=(num+MAX)%size;
while(hash[num]!=MAX && hash[num]!=temp)
num=(num+key)%size;
if( hash[num]==MAX ) return 0;
else return sum[num];
}
几种比较好的哈希方法
最新推荐文章于 2022-09-02 20:17:50 发布