实验八 哈希表问题.docx
- 文档编号:4685881
- 上传时间:2022-12-07
- 格式:DOCX
- 页数:12
- 大小:73.55KB
实验八 哈希表问题.docx
《实验八 哈希表问题.docx》由会员分享,可在线阅读,更多相关《实验八 哈希表问题.docx(12页珍藏版)》请在冰豆网上搜索。
实验八哈希表问题
HUNANUNIVERSITY
程序设计训练
报告
实验八:
哈希表问题
学生姓名
学生学号
专业班级
指导老师
完成日期
题目:
哈希表问题
一、问题描述
随机生成一个含有1000个数据的测试数据,数据形式可以如下所示(测试数据不一定要和以下一样,可以自己设计):
KeyValue
张三111111111
张三212222222
…
李四121111111
李四222222222
…
王五131111111
王五232222222
…
同时把该数据输出到一个文本文件中,将来用于比对。
并使用哈希表存储数据、查找数据。
二、问题分析
1、使用哈希表存储以上数据(在存储数据时要考虑哈希函数的设计,冲突解决方法等问题)
2、使用普通的链表存储以上数据
3、比较两者运行时间
三、算法分析
首先生成1000个目标对象,包括姓名及其幸运数字。
生成随机数,并存储于文件中。
之后,将姓名进行处理,采用自定义和哈希函数,计算出其下标,并采用开散方法,将数据进行存储。
同时采用也将数据构建出链表。
查找时,先计算出所需要的下标值,再一次查找,输出对应的幸运数字,之后再用链表方式从头开始查找幸运数字。
四、详细设计
本题目中,采用哈希表和链表两种方法进行数据的查找。
A、首先定义出1000个姓名;
stringfirstName[10]={"Blue","Brown","White","Lee","Bush","Bruce","James","Hill","Owen","Shaw"};
stringmiddleName[10]={"Solomon","Walker","Lucy","Jessica","Wendy","Zoe","Sam","Karl","Frank","Gary"};
stringlastName[10]={"Luke","David","Marlin","Jim","Vector","Xavier","Robin","Madeline","Geogre","Sue"};
B、定义哈希表节点;
classdata
{
public:
stringkey;
intluckynum;
};
C、定义自己的哈希函数,实现不同姓名的区别存储;
intHashFunction(stringr)
{
inti;
intsum=0;
for(i=0;i sum+=i*(int)r[i]; return(sum)%1000; } D、1000组随机数据随机生成,伴随在每一个姓名后面作为幸运数字,再保存到相应的文件中; voidsave() { cout<<"正在计算每位成员的幸运数字中..."< srand((unsigned)time(NULL));//用于产生随机数,生成成员幸运数字 //datatempData; ofstreamout("E: \\LuckyNumber.txt"); intidx=0; for(inti=0;i<10;i++) { for(intj=0;j<10;j++) for(intk=0;k<10;k++) { //数据生成 Data[idx].key=lastName[i]+"·"+middleName[j]+"·"+firstName[k]; Data[idx].luckynum=rand()%1000+1000; //将数据存于文件中 if(out.is_open()) { out< out<<""; out< out< } idx++; } } out.close(); cout<<"每位成员幸运数字已生成完毕,存贮与E: \\LuckyNumber.txt"< } E、构建哈希表,将每个位置的值放到合适位置,如果发生冲突,则向后放置; voidputdata(datatemp) { intindex=HashFunction(temp.key);//下标位置 HashTable[index].push_back(temp); } voidbuildHashTable() { for(inti=0;i<1000;i++) { putdata(Data[i]); } cout<<"请选择是否查看哈希表1.是2.否"; intchoose; cin>>choose; if(choose==1) displayHashTable(); } F、两种不同的查找方式; voidsearchHash(stringstr) { intidx=HashFunction(str);//获取下标 for(inti=0;i { LISTDATA: : iteratork; for(k=HashTable[idx].begin();k! =HashTable[idx].end();++k) { if(pare(k->key)==0)//如果两者相等 { cout<<"表中有此成员,其在哈希表中下标为"< cout<<"姓名: "< "< return; } } } cout<<"这个人不在表中"< } voidsearchList(stringstr,LISTDATA&listData) { LISTDATA: : iteratori;//声明i为迭代器 for(i=listData.begin();i! =listData.end();++i) { if(pare(i->key)==0)//如果相等 { cout<<"表中有此成员"< cout<<"姓名: "< "< return; } } cout<<"这个人不在表中"< } G、具体实现框架: #include #include #include #include #include #include #include usingnamespacestd; stringfirstName[10]={"Blue","Brown","White","Lee","Bush","Bruce","James","Hill","Owen","Shaw"}; stringmiddleName[10]={"Solomon","Walker","Lucy","Jessica","Wendy","Zoe","Sam","Karl","Frank","Gary"}; stringlastName[10]={"Luke","David","Marlin","Jim","Vector","Xavier","Robin","Madeline","Geogre","Sue"}; classdata { public: stringkey; intluckynum; }; dataData[1000];//输入数据的数组 listHashTable[1000];//哈希表 typedeflistLISTDATA;//创建一个list容器的实例LISTDATA intHashFunction(stringr) { inti; intsum=0; for(i=0;i sum+=i*(int)r[i]; return(sum)%1000; } voiddisplayHashTable() { cout<<"当前哈希表为"< for(inti=0;i<1000;i++) { cout<<"["< if(HashTable[i].size()! =0) { LISTDATA: : iteratork; for(k=HashTable[i].begin();k! =HashTable[i].end();++k) { cout<<"->"< } } cout<<"->NULL"< } } //哈希表存一个数据 voidputdata(datatemp) { intindex=HashFunction(temp.key);//下标位置 HashTable[index].push_back(temp); } voidbuildHashTable() { for(inti=0;i<1000;i++) { putdata(Data[i]); } cout<<"请选择是否查看哈希表1.是2.否"; intchoose; cin>>choose; if(choose==1) displayHashTable(); } voidbuildList(LISTDATA&listData) { for(inti=0;i<1000;i++) listData.push_back(Data[i]); } voidsave() { cout<<"正在计算每位成员的幸运数字中..."< srand((unsigned)time(NULL));//用于产生随机数,生成成员幸运数字 //datatempData; ofstreamout("E: \\LuckyNumber.txt"); intidx=0; for(inti=0;i<10;i++) { for(intj=0;j<10;j++) for(intk=0;k<10;k++) { //数据生成 Data[idx].key=lastName[i]+"·"+middleName[j]+"·"+firstName[k]; Data[idx].luckynum=rand()%1000+1000; //将数据存于文件中 if(out.is_open()) { out< out<<""; out< out< } idx++; } } out.close(); cout<<"每位成员幸运数字已生成完毕,存贮与E: \\LuckyNumber.txt"< } voidsearchHash(stringstr) { intidx=HashFunction(str);//获取下标 for(inti=0;i { LISTDATA: : iteratork; for(k=HashTable[idx].begin();k! =HashTable[idx].end();++k) { if(pare(k->key)==0)//如果两者相等 { cout<<"表中有此成员,其在哈希表中下标为"< cout<<"姓名: "< "< return; } } } cout<<"这个人不在表中"< } voidsearchList(stringstr,LISTDATA&listData) { LISTDATA: : iteratori;//声明i为迭代器 for(i=listData.begin();i! =listData.end();++i) { if(pare(i->key)==0)//如果相等 { cout<<"表中有此成员"< cout<<"姓名: "< "< return; } } cout<<"这个人不在表中"< } intmain() { LISTDATAlistData;//链表存储 save();//生成数据 buildHashTable();//将数据存入哈希表中 buildList(listData);//将数据存入链表中 stringsearch; boolt=true; while(t) { cout<<"请输入要查找的关键字: "< cin>>search; cout<<"通过哈希表查找: "< DWORDstart_timeHash=GetTickCount(); searchHash(search); DWORDend_timeHash=GetTickCount(); cout<<"费时: "< cout<<"通过链表查找: "< DWORDstart_timelist=GetTickCount(); searchList(search,listData); DWORDend_timelist=GetTickCount(); cout<<"费时: "< cout<<"是否继续查找? 1.是2.否"< intn; cin>>n; if(n==2)t=false; } return0; } 五、调试与测试 1.在调试过程中,需要按照规定格式进行输入,验证程序是否正确; 2.运行程序,并观察打印结果。 六、分析与总结 1.从测试结果来看,输出数据与预期一致、 2.注意在计算运行时间时要讲输入数据的时间排除在外。//链表
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验八 哈希表问题 实验 哈希表 问题