[问题描述] 为班级30个人的姓名设计一个哈希表,平均查找长度的上限为2,完成相应的建表和查表 [基本要求] 姓名使用汉语拼音表示,用除留余数法构造哈希函数,用线性探测再散列法处理冲突; 可以显示哈希表,输入人名后,查找成功则显示姓名、关键字、存储位置及平均查找长度等信息,找不到给出对应提示。
时间: 2024-03-23 18:42:02 浏览: 89
题目4:通讯录的制作 设计任务: 针对你所在班集体中的“人名”,设计一个哈希表,使得平均查找长度不超过R,完成相应的建表和查找过程。 设计要求: 1.每个人的信
好的,我会针对你的问题进行回答。
首先,根据你的要求,我们需要设计一个哈希表来存储30个人的姓名,且平均查找长度的上限为2。为了实现这个目标,我们可以采用除留余数法构造哈希函数,用线性探测再散列法处理冲突。
具体步骤如下:
1. 首先确定哈希表的大小,由于我们只需要存储30个人的姓名,可以选择哈希表的大小为31,因为31是一个质数,有利于减少冲突的发生。
2. 然后根据哈希函数,将每个人的姓名映射到哈希表中的一个位置上。假设我们使用汉语拼音表示每个人的姓名,那么可以将每个姓名的首字母的ASCII码值相加,然后取余数得到该姓名在哈希表中的位置。具体公式如下:
```
hash(key) = (key[0] + key[1] + ... + key[n-1]) % 31
```
其中,`key`表示每个人的姓名。
3. 如果发生冲突,即两个人的姓名映射到了同一个位置上,我们可以使用线性探测再散列法来解决。具体的做法是,从发生冲突的位置开始,依次向后查找,直到找到一个空闲位置或者查找了整个哈希表。如果找到了空闲位置,就将该姓名存储在该位置上;否则,就重新计算哈希值,继续查找下一个位置,直到找到一个空闲位置为止。
4. 最后,为了保证平均查找长度的上限为2,我们需要控制哈希表的装载因子。装载因子是指已经存储的数据占哈希表总大小的比例。通常情况下,装载因子不宜超过0.7,否则会导致冲突的频率过高,影响查找效率。因此,在本例中,我们可以设置哈希表的最大容量为43(31/0.7),当哈希表中已经存储了43个人的姓名时,就需要重新构建一个更大的哈希表来存储数据。
完成建表后,我们可以输入人名进行查找。具体操作如下:
1. 输入要查找的人名,将其转换为哈希表中的位置。
2. 如果该位置上存储的姓名与要查找的姓名相同,说明查找成功,输出该人名、关键字、存储位置及平均查找长度等信息。
3. 如果该位置上存储的姓名与要查找的姓名不同,说明发生了冲突,需要继续向后查找,直到找到空闲位置或者查找了整个哈希表。
4. 如果找到空闲位置,说明要查找的人名不存在,给出对应提示。
5. 如果查找了整个哈希表,仍然没有找到要查找的人名,也给出对应提示。
最后,为了方便查看哈希表中的存储情况,可以编写一个显示哈希表的函数,将哈希表中每个位置上存储的数据都输出到屏幕上。
阅读全文