题目描述:
设哈希函数为H(key)=i/2,其中i为关键字中的第一个字母在字母表中的序号,处理冲突使用线性探测法。编程实现:构造哈希表:在地址空间为0~12,对以下关键字序列:(Jan,Feb,Apr,May,Jun,Jul,Aug,Sep,Oct)建哈希表,并且求出等概率情况下查找成功与不成功的平均查找长度。
实现代码:
typedef struct HashTable{
char data[4];
int count; //记录比较次数
}HashTable;
void createHash(HashTable H[], int n){
int key, i,d,key_new;
char ch[9][4] = { { "Jan" }, { "Feb" }, { "Apr" }, { "May" }, { "Jun" }, { "Jul" }, { "Aug" }, { "Sep" }, { "Oct" } };
for (int j = 0; j < n; j++){ //哈希表的初始化
H[j].data[0] = ' '; //首字符为‘ ’代表空
H[j].count = 0;
}
for (int j = 0; j < 9; j++){
i = ch[j][0] - 'A' + 1;
key = i / 2;
if (H[key].data[0] == ' '){
H[key].count = 1;
strcpy(H[key].data, ch[j]);
}
else //使用线性探测法解决冲突
{
d = 1; //增量
key_new = (key + d) % n;
while (H[key_new].data[0]!=' ')
{
d++;
key_new = (key + d) % n;
}
strcpy(H[key_new].data, ch[j]);
H[key_new].count = d+1;
}
}
}
float succLength(HashTable H[], int n){
int num = 0, sum = 0;
float ASL;
for (int i = 0; i < n; i++){
if (H[i].data[0] != ' '){
sum += H[i].count;
num++; //记录哈希表中实际存在多少个值
}
}
ASL = (float)sum / num;
return ASL;
}
float unsuccLength(HashTable H[], int n){
int sum = 0, num = 0,k;
float ASL;
for (int i = 0; i < n; i++){
num = 1;
if (H[i].data[0] != ' '){
k = (i + 1) % n;
num++; //num记录哈希表中每个序号查找不成功的次数
while (H[k].data[0] != ' '){
num++;
k = (k + 1) % n;
}
}
sum += num;
}
ASL = (float)sum / n;
return ASL;
}
int main(){
HashTable H[13];
float ASL_succ, ASL_unsucc;
createHash(H, 13);
ASL_succ = succLength(H, 13);
ASL_unsucc = unsuccLength(H, 13);
printf("查找成功的平均查找长度:%.2f\n", ASL_succ);
printf("查找不成功的平均查找长度:%.2f", ASL_unsucc);
system("pause");
return 0;
}