哈希函数

#include<stdio.h>
#define n 8
#define m 11
void InitHash(int HT[])  //构建哈希函数 
{
int i;
for(i=0;i<m;i++)
HT[i]=0;
}
int Hash(int key)    //哈希函数    除留余数法
{
return key%m;
}
void InserHash(int HT[],int key)
{
int h,d,s;
h=Hash(key);  //计算哈希地址 
while(HT[h])  //如果内容不是0,那么说明冲突,解决冲突 
{
h=(h+1)%m;
}
HT[h]=key;    //存放关键字 

int SearchHash(int HT[],int key)
{
int sum=0,h,d;
h=Hash(key);
while(HT[h]!=key)
{
h=(h+1)%m;
sum++;


return sum;

}


int main()
{
int x[n]={22,41,53,46,30,13,1,67};
int ht[m],cs,sum,i;
InitHash(ht);

for(i=0;i<n;i++)
InserHash(ht,x[i]);

for(i=0;i<m;i++)
{
if(ht[i]!=0)
printf("i=%d  %d \n",i,ht[i]);
}
printf("\n");

cs=0;
for(i=0;i<n;i++)
{
sum=SearchHash(ht,x[i]);
if(sum!=-1)
cs+=sum;
}
printf("cs=%d\n",cs);
printf("ASL=%f\n",(double)(cs)/n);      //查找成功的概率为 查找成功的次数/元素的个数
return 0;

}



下面是结构体查找

#include<stdio.h>
#include<stdlib.h>
#include <malloc.h>
#define m 12
#define n 13
typedef struct {
  int *elem;
  int count;
}HashTable;
int initHash(HashTable *H)
{
    H->count=n;
H->elem=(int *)malloc(n*sizeof(int));
    if(!H->elem)
  return -1;

int i;
for(i=0;i<n;i++)
{
H->elem[i]=0;
}
return 0;
}
int Hash(int key)
{
int h=key%n;
return h;
}
int insertHash(HashTable *H,int key)
{
int h,sum=0;
h=Hash(key);
while(H->elem[h])
{
h=(h+1)%n;


}
H->elem[h]=key; 
return 0;
}
int searchHash(HashTable *H,int key,int *a)
{
int h=Hash(key),w=0;
while(H->elem[h]!=key)
{
h=(h+1)%n;
(*a)++;
w++;
if(w==n)
break;
}
if(w==n)
return -1;
return 0;
}
int main()
{
int i,a[m]={32,40,36,53,16,46,71,27,42,24,49,64},sum=0;
HashTable H;
initHash(&H);
for(i=0;i<m;i++)
{
insertHash(&H,a[i]);
}
for(i=0;i<n;i++)
{
if(H.elem[i])
printf("%d %d\n",i,H.elem[i]);
}
for(i=0;i<n;i++)
searchHash(&H,a[i],&sum);
printf("%d\n",sum);
double chenggong=(double)sum/m;
    printf("%lf\n",chenggong);
return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值