哈希表

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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) 查找哈希表

在哈希表中进行查找,输出查找的结果和关键字,并计算和输出查找成功的平均查找长度

相关文档
最新文档