哈希表
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一.问题描述
1问题描述
针对某个集体(比如你所在的班级)中的“人名”设计一个哈希表,使得平均查找长度不超过R,完成相应的建表和查表程序。
2.基本要求
假设人名为中国人姓名的汉语拼音形式。待填入哈希表的人名共有30个,取平均查找长度的上限为2。哈希函数用除留余数法构造,用伪随机探测再散列发处理冲突。
二. 需求分析
(1)针对某个集体中的人名设计一个哈希表,使得平均查找长度不超过R,完成相应的建立和查表程序。
(2)人名为汉语拼音形式,最长不超过19个字符(如:庄双双zhuangshuangshuang)。
(3)假设待填入哈希表的人名有30个,平均查找长度的上限为2。哈希表用除留余数法构造,用伪随机探测在散列法处理冲突。
(4)在输入人名过程中能自动识别非法输入,并给与非法输入的反馈信息要求重新输入。
(5)查找成功时,显示姓名及关键字,并计算和输出查找成功的平均查找长度
三.程序设计
1 .存储结构设计
typedef struct
{ char *py; //名字的拼音
int k; //拼音所对应的整数
}NAME;
typedef struct //哈希表
{ char *py; //名字的拼音
int k; //拼音所对应的整数
int si; //查找长度
}HASH;
2 .主要算法设计
(1)姓名(结构体数组)初始化
名字以拼音的形式够成字符串,将字符串的各个字符所对应的ASCII码相加,所得的整数做为哈希表的关键字。
void InitNameList()
{ char *f;
int r,s0,i;
NameList[0].py="chenliang";//陈亮
NameList[1].py="chenyuanhao";//陈元浩
NameList[2].py="chengwenliang";//程文亮
NameList[3].py="dinglei";//丁磊
NameList[4].py="fenghanzao";//冯汉枣
NameList[5].py="fuzongkai";//付宗楷
NameList[6].py="hujingbin";//胡劲斌
NameList[7].py="huangjianwu";//黄建武
NameList[8].py="lailaifa";//赖来发
NameList[9].py="lijiahao";//李嘉豪
NameList[10].py="liangxiaocong";//梁晓聪
NameList[11].py="linchunhua";//林春华
NameList[12].py="liujianhui";//刘建辉
NameList[13].py="luzhijian";//卢志健
NameList[14].py="luonan";//罗楠
NameList[15].py="quegaoxiang";//阙高翔
NameList[16].py="sugan";//苏淦
NameList[17].py="suzhiqiang";//苏志强
NameList[18].py="taojiayang";//陶嘉阳
NameList[19].py="wujiawen";//吴嘉文
NameList[20].py="xiaozhuoming";//肖卓明
NameList[21].py="xujinfeng"; //许金峰
NameList[22].py="yanghaichun";//杨海春
NameList[23].py="yeweixiong";//叶维雄
NameList[24].py="zengwei";//曾玮
NameList[25].py="zhengyongbin";//郑雍斌
NameList[26].py="zhongminghua";//钟明华
NameList[27].py="chenliyan";//陈利燕
NameList[28].py="liuxiaohui";//刘晓慧
NameList[29].py="panjinmei";//潘金梅
for(i=0;i { s0=0; f=NameList[i].py; for(r=0;*(f+r)!='\0';r++) */将字符串的各个字符所对应的ASCII码相加,所得的整数做为哈希表的关键字*/ s0=*(f+r)+s0; NameL ist[i].k=s0; } } (2)建立哈希表 (1)用除留余数法构建哈希函数 (2)用伪随机探测再散列法处理冲突 void CreateHashList() { int i; for(i=0; i { HashList[i].py=""; HashList[i].k=0; HashList[i].si=0; } for(i=0;i { int sum=0; int adr=(NameList[i].k)%M; //哈希函数 int d=adr; if(HashList[adr].si==0) //如果不冲突 { HashList[adr].k=NameList[i].k; HashList[adr].py=NameList[i].py; HashList[adr].si=1; } else //冲突 { do { d=(d+NameList[i].k%10+1)%M; //伪随机探测再散列法处理冲突 sum=sum+1; //查找次数加1 }while (HashList[d].k!=0); HashList[d].k=NameList[i].k; HashList[d].py=NameList[i].py; HashList[d].si=sum+1; } } } (3) 查找哈希表 在哈希表中进行查找,输出查找的结果和关键字,并计算和输出查找成功的平均查找长度