综合实验最终.docx
- 文档编号:5266745
- 上传时间:2022-12-14
- 格式:DOCX
- 页数:16
- 大小:85.06KB
综合实验最终.docx
《综合实验最终.docx》由会员分享,可在线阅读,更多相关《综合实验最终.docx(16页珍藏版)》请在冰豆网上搜索。
综合实验最终
附件2天津商业大学学生实验报告
开课实验室:
信息实验室开课时间11年9月1日实验报告11年12月2日
学院名称
理学院
年级、专业、班
计算09-01
学号
20091796
姓名
常中祥
同组姓名
第二组
课程名称
数据结构
实验项目名称
哈希表实验报告
指导教师
黄橡丽
实验类型
验证□综合■设计□创新□
成绩
教师评语
教师签名:
年月日
实验报告内容一般包括以下几个内容:
1、目的要求2、仪器用具及材料(仪器名称及主要规格、用具名称)3、实验内容及原理(简单但要抓住要点,写出依据原理)4、操作方法与实验步骤5、数据图表格(照片)6、实验过程原始记录7数据处理及结果(按实验要求处理数据、结论)8、作业题9、讨论(对实验中存在的问题、进一步的想法等进行讨论)
1.实验内容
针对本班中的“人名”设计一个哈希表,使得平均查找长度不超过2,完成相应的建表和查表程序。
假设人名为中国人姓名的汉语拼音形式,待填入哈希表的人名共有30个,取平均查找长度的上限为2。
哈希函数用除留余数法构造,用伪随机探测再散列法处理冲突。
2.需求分析
(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=
数据关系:
R={ 基本操作: voidInitNameList() 操作结果: 初始化一个哈希表 voidcreateHashList() 操作结果: 创建一个哈希表 voidFindList() 前置条件: 哈希表已经建立,s非空 后置条件: 查找所输入的人名在不在哈希表中 voidDisplay() 前置条件: 哈希表已经建立,s非空 后置条件: 显示创立的哈希表 }; 3.2模块划分 本程序的模块可分为两个大模块: 主程序模块和哈希表模块, 其中哈希表模块又可分为初始化模块,建立模块,查找模块,显示模块, 4.详细设计 4.1数据类型的定义 typedefstruct {char*py;//名字的拼音 intk;//拼音所对应的整数 }NAME; NAMENameList[HASH_LENGTH];//全局变量NAME typedefstruct//哈希表 {char*py;//名字的拼音 intk;//拼音所对应的整数 intsi;//查找长度 }HASH; HASHHashList[HASH_LENGTH];//全局变量HASH 4.2主要模块的算法描述 初始化(创立)模块算法: voidInitNameList() {char*f; intr,s0,i; for(i=0;i { NameList[i].py=newchar[64]; NameList[i].py[0]=0; } for(i=0;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; } for(i=0;i { 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<<"请输入姓名的拼音: "< cin>>name;; for(r=0;r<20;r++) s0+=name[r]; adr=s0%M; d=adr; if(HashList[adr].k==s0) cout<<"姓名: "< "< 1"< elseif(HashList[adr].k==0) cout<<"无此记录! "< else { intg=0; while(g==0) { d=(d+s0%10+1)%M; sum=sum+1; if(HashList[d].k==0) { cout<<"无此记录! "< g=1; } if(HashList[d].k==s0) { cout<<"姓名: "< "< "< g=1; } }; } } 显示哈希表模块的算法: voidDisplay() { inti; floataverage=0; cout<<"\n地址\t关键字\t\t搜索长度\tH(key)\t姓名\n"; for(i=0;i<50;i++) { cout< cout<<"\t"< cout<<"\t\t"< cout<<"\t\t"<<(HashList[i].k%M)<<""; cout<<"\t"< cout<<"\n"; } for(i=0;i average+=HashList[i].si; average/=NAME_NO; cout<<"平均查找长度: ASL("< } 4.3主函数部分 主程序算法: intmain() { charx; InitNameList(); CreateHashList(); cout<<"d.显示哈希表f.查找任意键退出请选择: "< while(cin>>x) { if(x=='d') { Display(); cout< } elseif(x=='f') { FindList(); cout< } elsebreak; } for(inti=0;i { 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 #include usingnamespacestd; #defineHASH_LENGTH50//哈希表的长度 #defineM47//随机数 #defineNAME_NO30//人名的个数 typedefstruct {char*py;//名字的拼音 intk;//拼音所对应的整数 }NAME; NAMENameList[HASH_LENGTH];//全局变量NAME typedefstruct//哈希表 {char*py;//名字的拼音 intk;//拼音所对应的整数 intsi;//查找长度 }HASH; HASHHashList[HASH_LENGTH];//全局变量HASH voidInitNameList()//姓名(结构体数组)初始化 {char*f; intr,s0,i; for(i=0;i { NameList[i].py=newchar[64]; NameList[i].py[0]=0; } 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"); for(i=0;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; } for(i=0;i { 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<<"请输入姓名的拼音: "< cin>>name; for(r=0;r<20;r++)//求出姓名的拼音所对应的整数(关键字) s0+=name[r]; adr=s0%M;//使用哈希函数 d=adr; if(HashList[adr].k==s0)//分3种情况进行判断 cout<<"姓名: "< "< 1"< elseif(HashList[adr].k==0) cout<<"无此记录! "< else { intg=0; while(g==0) { d=(d+s0%10+1)%M;//伪随机探测再散列法处理冲突 sum=sum+1; if(HashList[d].k==0) { cout<<"无此记录! "< g=1; } if(HashList[d].k==s0) { cout<<"姓名: "< "< "< g=1; } }; } } voidDisplay()//显示哈希表 { inti; floataverage=0; cout<<"\n地址\t关键字\t\t搜索长度\tH(key)\t姓名\n";//显示的格式 for(i=0;i<50;i++) { cout< cout<<"\t"< cout<<"\t\t"< cout<<"\t\t"<<(HashList[i].k%M)<<""; cout<<"\t"< cout<<"\n"; } for(i=0;i average+=HashList[i].si; average/=NAME_NO; cout<<"平均查找长度: ASL("< } intmain() { charx; InitNameList(); CreateHashList(); cout<<"d.显示哈希表f.查找任意键退出请选择: "< while(cin>>x) { if(x=='d') { Display(); cout< } elseif(x=='f') { FindList(); cout< } elsebreak; } for(inti=0;i { free(NameList[i].py); free(HashList[i].py); } return0; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 综合 实验 最终
![提示](https://static.bdocx.com/images/bang_tan.gif)