哈希函数常用构造方法
直接定址法
数字分析法
平方取中法
除留余数法
随机数法
哈希函数处理冲突方法
开放定址法【线性探测法,二次探测法,随机探测法】
再哈希函数法
链地址法(拉链法,哈希桶)
公共溢出区法
声明定义
#include
#include
#include
#define Field -1
#define null -32768
typedef struct hashmap{
int count;//哈希表长度
int *array;//哈希表
}Hashmap;
Hashmap *hashtable;
int k = 0;
int hash(int key);
void init(int i);
void hash_map(int *key);
int Search_hash(int search_key);
int linear_probe(int hash_addr);
哈希构造函数(除留余数法)
int hash(int key)
{
return key%hashtable->count;
}
哈希表初始化
void init(int k)
{
int i;
hashtable = (Hashmap*)malloc(sizeof(Hashmap));
hashtable->count = k;
hashtable->array = (int*)malloc(sizeof(int)*hashtable->count);
for(i=0;icount;i++)
{
hashtable->array[i]=null;
}
}
哈希表插值函数
void hash_map(int key)
{
int i,index;
int hash_addr;
for(i=0;icount;i++)
{
hash_addr = hash((key+i));
while(hashtable->array[hash_addr]!=null)//判断是否为空(防冲突)
{
hash_addr = linear_probe(hash_addr);
}
hashtable->array[hash_addr] = *(key+i);
}
}
哈希查找函数
int Search_hash(int search_key)
{
int hash_addr;
hash_addr = hash(search_key);
while(hashtable->array[hash_addr]!=search_key)
{
hash_addr = linear_probe(hash_addr);
if(hash_addr == hash(search_key))
{
return Field;
}
}
return hash_addr;
}
防冲突函数(线性探测法)
int linear_probe(int hash_addr)
{
hash_addr = (hash_addr+1)%hashtable->count;
return hash_addr;
}
主函数
int main()
{
int num;
int i,search_key,search_hash;
int array[] = {2,7,6,8};
i = sizeof(array)/4;//数组长度
init(i);//哈希表初始化
hash_map(array);//创建哈希表
printf(“请输入所要搜索的key:”);
scanf("%d",&search_key);
search_hash = Search_hash(search_key);
if(search_hash == Field)
printf(“search hash_addr field\n”);
else
printf(“search hash_addr succesful!\nthe hash_addr is:%d\n”,search_hash);
system(“pause”);
return 0;
}
线性探测法会使哈希表出现"堆积"现象,影响哈希查找效率。