问题描述:已知一个含有1000个元素的表,关键字为中国人姓氏的拼音,给出此表的一个哈希表设计方案。 基本要求:1.解决哈希冲突应采用链表法。2.编写一个测试主函数。3.求出所设计哈希表在等概率情况下的平均查找长度。4.用c语言解决
时间: 2024-02-22 19:56:12 浏览: 76
人名查询哈希表设计(链地址法)
5星 · 资源好评率100%
好的,针对您的问题,我可以为您提供一个哈希表设计方案,并给出相应的c语言实现。具体方案如下:
1.确定哈希函数
由于关键字为中国人姓氏的拼音,我们可以考虑取姓氏拼音首字母的ASCII码值作为哈希函数的关键字。具体的,将姓氏拼音首字母的ASCII码值作为关键字k,使用以下哈希函数计算该元素在哈希表中的位置:
h(k) = k % 1000
其中,1000为哈希表的大小。
2.解决哈希冲突
基于链表法解决哈希冲突。具体的,对于哈希表中的每个位置,都维护一个链表,将哈希函数计算得到相同位置的元素插入到对应位置的链表中。
3.编写测试主函数
下面是一个简单的测试主函数,用于测试哈希表的插入和查找功能:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define TABLE_SIZE 1000
struct node {
char name[20];
struct node *next;
};
struct node *table[TABLE_SIZE];
int hash(char *name) {
return name[0] % TABLE_SIZE;
}
void insert(char *name) {
int index = hash(name);
struct node *new_node = (struct node *)malloc(sizeof(struct node));
strcpy(new_node->name, name);
new_node->next = NULL;
if (table[index] == NULL) {
table[index] = new_node;
} else {
struct node *temp = table[index];
while (temp->next != NULL) {
temp = temp->next;
}
temp->next = new_node;
}
}
struct node *find(char *name) {
int index = hash(name);
struct node *temp = table[index];
while (temp != NULL) {
if (strcmp(temp->name, name) == 0) {
return temp;
}
temp = temp->next;
}
return NULL;
}
int main() {
memset(table, 0, sizeof(table));
insert("zhang");
insert("li");
insert("wang");
struct node *p = find("li");
if (p != NULL) {
printf("found: %s\n", p->name);
} else {
printf("not found\n");
}
return 0;
}
```
4.求出平均查找长度
在等概率情况下,哈希表的平均查找长度ASL可以用以下公式计算:
ASL = (1+1/2+1/3+...+1/m)*m/(m-n)
其中,m为哈希表的大小,n为哈希表中元素的个数。
在本题中,m=1000,n=3,因此ASL约为2.22。
这里提供一个c语言实现:
```c
#include <stdio.h>
float average_search_length(int m, int n) {
float sum = 0.0;
for (int i = 1; i <= n; i++) {
sum += 1.0 / i;
}
return sum * m / (m - n);
}
int main() {
int m = 1000, n = 3;
float asl = average_search_length(m, n);
printf("average search length: %.2f\n", asl);
return 0;
}
```
以上就是一个简单的哈希表设计方案和c语言实现,希望对您有所帮助。
阅读全文