一、实验题目
根据数据结构知识,设计哈希表的相关内容
二、需求分析
[问题描述]
针对某个集体中人名设计一个哈希表,使得平均查找长度不超过 R,并完成相应的建表
和查表程序。
[基本要求]
假设人名为中国人姓名的汉语拼音形式。待填入哈希表的人名共有 30 个,取平均查找
长度的上限为 2。哈希函数用除留余数法构造,用线性探测再散列法或链地址法处理冲突。
[测试数据]
取读者周围较熟悉的 30 个人名。
[选作内容]
(1)从教科书上介绍的集中哈希函数构造方法中选出适用者并设计几个不同的哈希函
数,比较他们的地址冲突率(可以用更大的名字集合作实验)。
(2)研究这 30 个人名的特点,努力找一个哈希函数,使得对于不同的拼音名一定不发
生地址冲突。
(3)在哈希函数确定的前提下尝试各种不同处理冲突的方法,考察平均查找长度的变
化和造好的哈希表中关键字的聚集性。
三、概要设计
代码如下
/*pmj 20191220*/
#include<iostream>
#include<malloc.h>
#include<string.h>
using namespace std;
#define geshu 50 //哈希表的长度
#define M 50
#define NAME_NO 30
typedef struct {
char *name;
int k; //拼音所对应的关键字
} Name;
typedef struct {
char *name;
int k; //拼音所对应的关键字
int len; //查找长度
} HASH;
Name ren[geshu];
HASH halt[geshu];
//main函数
int main() {
char *z;
int r, s0;
float average = 0;
for(int i=0; i<geshu; i++) {
cin>>ren[i].name;
}
for (int i = 0; i < NAME_NO; i++) { //求整数
s0 = 0;
z = ren[i].name; //方法:将字符串的各个字符所对应的ASCII码相加,所得的整数做为哈希表的关键字
for (r = 0; *(z + r) != '\0'; r++) //当字符为空时停止计算
s0 = *(z + r) + s0;
ren[i].k = s0; //利用循环将所有字符的ASCII码值相加
} //最终的到的值就是ASCII码值和
for (int i = 0; i < geshu; i++) { //哈希表的初始化
halt[i].name = "";
halt[i].k = 0;
halt[i].len = 0;
}
for (int i = 0; i < NAME_NO; i++) {
int sum = 0;
int adr = (ren[i].k) % M; //利用除留余数法构造哈希函数
int d = adr;
if (halt[adr].len == 0) { //如果不冲突则存储到哈希表中
halt[adr].k = ren[i].k;
halt[adr].name = ren[i].name;
halt[adr].len = 1;
} else { //存在冲突
do {
d = (d + ((ren[i].k)) % 10 + 1) % M;
sum = sum + 1; //查找次数加1
} while (halt[d].k != 0);
halt[d].k = ren[i].k;
halt[d].name = ren[i].name; //数值存入哈希表
halt[d].len = sum + 1; //接着查找下一个字符
}
}
cout << "姓名为:" <<"\t" << "地址为:" << "\t" << "关键字为:" << "\t\t" << "搜索的长度为:" << "\t" << "H为:" << "\t\t"<< endl; //显示的格式
for (int i = 0; i < 50; i++) {
cout << halt[i].name<< i << "\t" << halt[i].k << "\t\t" << halt[i].len << "\t\t" << (halt[i].k) % M << "\t\t" << endl;
} //依次输出
for (int i = 0; i < geshu; i++)
average += halt[i].len; //计算平均查找长度
average /= NAME_NO;
cout << "平均查找长度:ASL " << NAME_NO << "=" << average << endl;
}
四、调试分析
调试结果如图所示,无错误。
五、使用说明
第一步:在程序中输入30个人名
第二步:输出地址、关键字、探索长度、H、姓名
六、测试结果
七、其他数据结构实例
数据结构:编程带你了解约瑟夫环
数据结构:简易停车场管理系统
数据结构:哈夫曼编/译码设计
数据结构:图的基本操作模拟-校园导游
以上内容为个人学习总结,如有遗漏或者错误请在评论区中指正!!!
如果看完觉得有所收获的话,记得一键三连哦,谢谢大家!