1. 直接定址法
h(k)=k+c (c≥0
h(k)=k+c (c≥0
2. 除留余数法
h(k)=k mod p (mod为求余运算,p≤m)
p最好取小于m的质数(素数)。
3. 数字分析法
{92317602,92326875,92739628,92343634,92706816,
92774638,92381262,92394220}
通过分析可知,每个关键字从左到右的第1、2、3位和第6位取值较集中,不宜作为哈希函数,剩余的第4、5、7和8位取值较分散,可根据实际需要取其中的若干位作为哈希地址。若取最后两位作为哈希地址,则哈希地址的集合为{2,75,28,34,16,38,62,20}。
d0=h(k)
di=(di-1+1) mod m (1≤i≤m-1)
n=11,m=13,除留余数法的哈希函数为h(k)=k mod p,p应为小于等于m的素数,假设p取值13
#define MaxSize 100
#define NULLKEY -1
#define DELKEY -2
typedef int KeyType;
typedef char* InfoType;
typedef struct
{
KeyType key;
InfoType data;
int count;
} HashTable[MaxSize];
int SeachHT(HashTable ht, int p, KeyType k)
{
int i = 0, addr;
addr = k % p;
while (ht[addr].key != NULLKEY && ht[addr].key != k)
{
addr = (addr + 1) % p;
}
if (ht[addr].key == k)
{
return addr;
}
else
{
return -1;
}
}