哈希查找算法的思想:通过对元素的关键字值进行某种运算,直接求出元素的地址,即使用关键字到地址的直接转换方法,而不需要反复比较。
直接转换方法有很多,这里介绍最常用的一种方法:除留取余法,即H(key)=key%p;p一般为小于表长的最大质数。例如,表长为100,p取97.
//实现哈希查找算法
#include <stdio.h>
#include <stdlib.h>
#define m 20 //散列表的长度
#define n 12 //元素个数
#define t 19 //t为不大于散列表长度的最大质数
typedef struct
{
int key;//关键字,此处可理解为元素的大小
int compare;//比较次数
} HashTable;
HashTable a[20]={0};
int b[12]={12,2,1,34,45,56,32,7,5,44,13,6};
//创建散列表
void CreatHash()
{
for(int i=0;i<n;i++)
{
int H0=b[i]%t;
if(a[H0].key==0)
{
a[H0].key=b[i];
a[H0].compare=1;
}
else
{
for(int j=1;j<m;j++)
{
int H1=(H0+j)%m;
if(a[H1].key==0)
{
a[H1].key=b[i];
a[H1].compare=1+j;
break;
}
}
}
}
}
//散列表的查找
int SearchHash(HashTable a[20],int key)
{
int H0=key%t;
int H1;
if(a[H0].key==0)
{
printf("查找失败!查找次数为:%d\n",a[H0].compare);
return -1;
}
else if(a[H0].key==key)
{
printf("查找成功!查找次数为:%d",a[H0].compare);
return H0;
}
else
{
for(int j=1;j<m;j++)
{
int H1=(H0+j)%m;
if(a[H1].key==key)
{
printf("查找成功!查找次数为:%d",a[H1].compare);
return H1;
}
else if(a[H1].key==0)
{
printf("查找失败!查找的次数为:%d",a[H1].compare);
return -1;
}
}
printf("查找失败!查找次数为:%d",a[H1].compare);
return -1;
}
}
int main()
{
int key;
CreatHash();
printf("{12,2,1,34,45,56,32,7,5,44,13,6}\n\n");
printf("要查找的数为:\n");
scanf("%d",&key);
SearchHash(a,key);
return 0;
}
运行结果为: