综合实验最终文档格式.docx
- 文档编号:18247023
- 上传时间:2022-12-14
- 格式:DOCX
- 页数:16
- 大小:85.06KB
综合实验最终文档格式.docx
《综合实验最终文档格式.docx》由会员分享,可在线阅读,更多相关《综合实验最终文档格式.docx(16页珍藏版)》请在冰豆网上搜索。
(1)针对某个集体中的人名设计一个哈希表,使得平均查找长度不超过2,完成相应的建立和查表程序.
(2)人名为汉语拼音形式,最长不超过18个字符(如:
常中祥changzhongxiang).
(3)假设待填入哈希表的人名有29个,平均查找长度为2。
哈希表用除留余数法构造,用伪随机探测再散列法处理冲突。
(4)在输入人名过程中能自动识别非法输入,并给与非法输入的反馈信息要求重新输入。
(5):
输入非法数据来检验
如:
zhuangshuangshuang,$%&
^&
*等等
查找输入:
zhouliuxiang查找成功
输入:
bernoulli,无记录
changzhongxiang查找成功
zhanglei无记录
(在输入时也输入非法数据来检验)
要完成如下要求:
设计哈希表实现姓名查找。
实现本程序需要解决以下几个问题:
◆用除留余数建立哈希函数。
◆如何利用伪随机探测再散列法处理冲突。
◆如何实现用哈希法查找并显示用户信息。
◆如何查找并显示给定用户的记录。
3.概要设计
3.1抽象数据类型定义
3.1抽象数据类型定义:
ADTHashList_T
{
数据对象:
D={ai|ai∈ElemSet,{不多于18个字符的字符串}0=<
i<
18};
数据关系:
R={<
ai-1,ai>
|ai-1,ai∈D,0=<
18}
基本操作:
voidInitNameList()
操作结果:
初始化一个哈希表
voidcreateHashList()
创建一个哈希表
voidFindList()
前置条件:
哈希表已经建立,s非空
后置条件:
查找所输入的人名在不在哈希表中
voidDisplay()
哈希表已经建立,s非空
显示创立的哈希表
};
3.2模块划分
本程序的模块可分为两个大模块:
主程序模块和哈希表模块,
其中哈希表模块又可分为初始化模块,建立模块,查找模块,显示模块,
4.详细设计
4.1数据类型的定义
typedefstruct
{char*py;
//名字的拼音
intk;
//拼音所对应的整数
}NAME;
NAMENameList[HASH_LENGTH];
//全局变量NAME
typedefstruct//哈希表
intsi;
//查找长度
}HASH;
HASHHashList[HASH_LENGTH];
//全局变量HASH
4.2主要模块的算法描述
初始化(创立)模块算法:
voidInitNameList()
{char*f;
intr,s0,i;
for(i=0;
i<
HASH_LENGTH;
i++)
{
NameList[i].py=newchar[64];
NameList[i].py[0]=0;
}
for(i=0;
NAME_NO;
i++)
{
s0=0;
f=NameList[i].py;
for(r=0;
*(f+r)!
='
\0'
;
r++)
s0=*(f+r)+s0;
NameList[i].k=s0;
}
建立哈希表模块的算法:
voidCreateHashList()
inti;
for(i=0;
i++)
HashList[i].py=newchar[64];
HashList[i].py[0]=0;
HashList[i].k=0;
HashList[i].si=0;
intsum=0;
intadr=(NameList[i].k)%M;
intd=adr;
if(HashList[adr].si==0)//如果不冲突
HashList[adr].k=NameList[i].k;
HashList[adr].py=NameList[i].py;
HashList[adr].si=1;
}
else//冲突
{
while(HashList[d].k!
=0)
d=(d+NameList[i].k%10+1)%M;
sum=sum+1;
HashList[d].k=NameList[i].k;
HashList[d].py=NameList[i].py;
HashList[d].si=sum+1;
查找哈希表模块的算法:
voidFindList()
stringname;
ints0=0,r,sum=1,adr,d;
cout<
<
"
请输入姓名的拼音:
endl;
cin>
>
name;
r<
20;
s0+=name[r];
adr=s0%M;
d=adr;
if(HashList[adr].k==s0)
姓名:
HashList[d].py<
"
关键字:
s0<
查找长度为:
1"
elseif(HashList[adr].k==0)
无此记录!
else
intg=0;
while(g==0)
d=(d+s0%10+1)%M;
if(HashList[d].k==0)
g=1;
if(HashList[d].k==s0)
sum<
显示哈希表模块的算法:
voidDisplay()
floataverage=0;
cout<
\n地址\t关键字\t\t搜索长度\tH(key)\t姓名\n"
50;
\t"
HashList[i].k<
\t\t"
HashList[i].si<
(HashList[i].k%M)<
\t"
HashList[i].py<
\n"
average+=HashList[i].si;
average/=NAME_NO;
平均查找长度:
ASL("
NAME_NO<
)="
average<
4.3主函数部分
主程序算法:
intmain()
charx;
InitNameList();
CreateHashList();
d.显示哈希表f.查找任意键退出请选择:
while(cin>
x)
if(x=='
d'
)
Display();
elseif(x=='
f'
FindList();
elsebreak;
for(inti=0;
free(NameList[i].py);
free(HashList[i].py);
return0;
4.4函数之间的调用关系
5.程序运行说明与测试
5.1用户手册
程序运行后自动生成哈希表
(1)欲显示哈希表数据,按”d”,回车键
(2)欲查找表中数据,按”f”,输入所要查找的内容,按回车键.
5.2测试数据
建立的哈希表数据:
changzhongxiangwanshengcaonayejinhuichengshuangzhuchunpengyinlixinwangxiaolingzhouliuxiang
isaccaristotlearchimedesdanieljohannzhouxunwangqianxiaomingtangronggaofeifeilvyuanhaohujingtao
chengjiandescartseeulersunchunyanzoudeqiangzhangyiyingqiuliuyingsunchunyan
查找合法数据:
zhouliuxiang
测试非法数据:
bernoulli
5.3测试结果及分析
显示哈希表:
其中平均查找长度为1.4333〈2,满足题意。
查找合法数据:
测试非法数据:
6.实验总结
实验中输入的人名不应该含有空格字符,否则会出现逻辑错误,这是程序的一个问题,本组尽量避免了此问题的发生。
经过本次的哈希表实验的实践,最核心的是构造一个哈希函数,哈希函数就是在关键字和记录在表中的位置之间建立一个函数关系,哈希函数其实很好找,但是要找到不冲突的哈希函数却没那么简单,经过我们团队的反反复复的实验,终于得到了结果,让我们真是感到欣慰。
附:
源程序清单
#include<
iostream>
string>
usingnamespacestd;
#defineHASH_LENGTH50//哈希表的长度
#defineM47//随机数
#defineNAME_NO30//人名的个数
intsi;
//全局变量HASH
voidInitNameList()//姓名(结构体数组)初始化
strcpy(NameList[0].py,"
changzhongxiang"
);
strcpy(NameList[1].py,"
wangsheng"
strcpy(NameList[2].py,"
yejinhui"
strcpy(NameList[3].py,"
caona"
strcpy(NameList[4].py,"
wangxiaoling"
strcpy(NameList[5].py,"
zhuchunpeng"
strcpy(NameList[6].py,"
chengshuang"
strcpy(NameList[7].py,"
yinlixin"
strcpy(NameList[8].py,"
zhuyuanzhang"
strcpy(NameList[9].py,"
zoudeqiang"
strcpy(NameList[10].py,"
zhangyiying"
strcpy(NameList[11].py,"
qiuliuying"
strcpy(NameList[12].py,"
sunchunyan"
strcpy(NameList[13].py,"
gaofeifei"
strcpy(NameList[14].py,"
zhouxun"
strcpy(NameList[15].py,"
lvyuanhao"
strcpy(NameList[16].py,"
wangqian"
strcpy(NameList[17].py,"
tangrong"
strcpy(NameList[18].py,"
hujingtao"
strcpy(NameList[19].py,"
xiaoming"
strcpy(NameList[20].py,"
zhouliuxiang"
strcpy(NameList[21].py,"
chengjian"
strcpy(NameList[22].py,"
descartse"
strcpy(NameList[23].py,"
archimedes"
strcpy(NameList[24].py,"
aristotle"
strcpy(NameList[25].py,"
euler"
strcpy(NameList[26].py,"
isacc"
strcpy(NameList[27].py,"
daniel"
strcpy(NameList[28].py,"
johann"
voidCreateHashList()//建立哈希表
//哈希函数
d=(d+NameList[i].k%10+1)%M;
voidFindList()//查找
r++)//求出姓名的拼音所对应的整数(关键字)
//使用哈希函数
if(HashList[adr].k==s0)//分3种情况进行判断
//伪随机探测再散列法处理冲突
voidDisplay()//显示哈希表
//显示的格式
intmain()
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 综合 实验 最终
