哈希表课程设计报告.docx
- 文档编号:11200774
- 上传时间:2023-02-25
- 格式:DOCX
- 页数:20
- 大小:18.97KB
哈希表课程设计报告.docx
《哈希表课程设计报告.docx》由会员分享,可在线阅读,更多相关《哈希表课程设计报告.docx(20页珍藏版)》请在冰豆网上搜索。
哈希表课程设计报告
哈希表设计
1需求分析
1.1针对某个集体中的人名设计一个哈希表,使得平均查找长度不超过R,完成相应的建立和查表程序.
1.2人名为汉语拼音形式,最长不超过18个字符(如:
庄双双zhuangshuangshuang).
1.3假设待填入哈希表的人名有30个,平均查找长度为2。
哈希表用除留余数法构造,用伪随机探测在散列法处理冲突。
1.4在输入人名过程中能自动识别非法输入,并给与非法输入的反馈信息要求重新输入。
1.5测试数据:
1)输入数据:
zhangyun,mochengcheng,geyuwei,zhouruifeng,yuanyan,mengxiangyin,wuxudong,chenghusheng,wangqi,zhangxiuhua,xiongliying,leiyang,hanbingfeng,zhangchao,yaoboyu,liyingtao,liutong,wangyingli,lixiang,lvxiaohu,huanglei,zhouxiong,zhangxinxin,hexuyang,linyoulu,zhangxiao,chenzhi,dongchaoxun,wangxinyu,yuman,zhangyao.(在输入是可以输入非法数据来检验如:
12345,
zhuangshuangshuang,$%&^&*等等)
2)查找输入:
zhuangyuan输出:
查找成功
输入:
zhuangshuangshuang输出:
查找失败
输入:
mochengcheng输出:
查找成功
输入:
zhanglei输出:
查找失败
(在输入时也输入非法数据来检验)
2概要设计
2.1哈希表的定义如下:
classHashList_T
{
数据对象:
D={A(i,j)={不多于18个字符的字符串}0=
基本操作:
voidcreateHashList(void);
操作结果:
创建一个哈希表
boolisLegal(string&s);
前置条件:
s是非空字符串
后置条件:
s合法字符串返回true,否则返回false
voidshow(boollhs)const;
前置条件:
lhs被初始化
后置条件:
lhs为真打印查找成功,否则打印查找失败
voidfindName(string&s);
前置条件:
哈希表已经建立,s非空
后置条件:
查找所输入的人名在不在哈希表中
intgetNumber(string&s)
前置条件:
s被初始化
后置条件:
返回s索引的值
boolisFull(inti)const
前置条件:
变量i被初始化并且i不超过哈希表的长度
后置条件:
第i行的链表满了返回true,否则返回false
boolisExistence(inti,string&s)
前置条件:
参数被初始化
后置条件:
s存在返回true,否则返回false
};
2.2主程序
voidmain()
{
初始化;
do
{
接受命令;
处理命令;
}while("命令"!
="退出");
}
2.3本程序的模块只有两个模块:
主程序模块和哈希表模块,调用关系为:
主程序模块调用哈希表模块.
3详细设计
3.1哈希表的私有成员为vector
3.2哈希表的基本操作设置:
HashList_T(intnumbers=1);
HashList_T(constHashList_T&rhs);
//初始化哈希表
~HashList_T(void);
//释放资源
HashList_T&operator=(constHashList_T&rhs);
//赋值函数
voidcreateHashList(void);
//创建哈希表
boolisLegal(string&s);
//判断人名是否合法
voidshow(boollhs)const;
//显示查找结果
voidfindName(void);
voidfindName(string&s);
//查找特定姓名
intgetNumber(string&s);
//得到索引号
boolisExistence(inti,string&s);
//第i行是否存在字符串s
boolisFull(inti)const;
//第i行向量是否满了
其中部分操作的算法:
HashList_T:
:
HashList_T(intnumbers)
{
m_numbers=numbers;
m_name_ptr=newvector
}
HashList_T:
:
~HashList_T(void)
{
delete[]m_name_ptr;
}
intHashList_T:
:
getNumber(string&s)
{
inti=s.size()%m_numbers;
boolresult=isFull(i);
if(!
result)
returni;
else
{
intj;
if(m_numbers%2==0)
j=m_numbers-1;
else
j=m_numbers-2;
i=(i+j)%m_numbers;
result=isFull(i);
while(result)
{
i=(i+j)%m_numbers;
result=isFull(i);
}
returni;
}
}
voidHashList_T:
:
createHashList(void)
{
inti=0,numbers;
stringname;
cout<<"输入要输入的人名总数:
"< cin>>numbers; while(i { if (1) { strings; cout<<"输入人名: "< cin>>s; name=s; } boolresult=isLegal(name); while(! result) { if (1) { strings; cout<<"输入非法,输入人名: "< cin>>s; name=s; } result=isLegal(name); } intj=getNumber(name); m_name_ptr[j].push_back(name); i++; } } voidHashList_T: : findName(void) { stringname; inti=1; while(i>0) { cout<<"输入查找人名"< cin>>name; boolresult=isLegal(name); while(! result) { cout<<"输入非法,再次输入人名"< cin>>name; } findName(name); cout<<"继续? yes--1.no--0"< cin>>i; } } boolHashList_T: : isExistence(inti,string&s) { if(m_name_ptr[i].empty()) returnfalse; vector : iteratorp; intj; if(m_numbers%2==0) j=m_numbers-1; else j=m_numbers-2; while(! m_name_ptr[i].empty()) { p=m_name_ptr[i].begin(); while(p! =m_name_ptr[i].end()) { if(*p==s) returntrue; p++; } i=(i+j)%m_numbers; } returnfalse; } 3.3主程序算法: voidmain() { HashList_Thash(18); hash.createHashList(); hash.findName(); } 4程序调试 4.1本次作业比较简单,只有一个核心算法就是构造散列函数的算法,在调试的时候发现string的问题(系统自带的),输入的人名不应该含有空格字符,否则回出现逻辑错误, 这是程序的一个问题,如果要修改成char[]型处理方法类似就没改.在调试其他代码时候没有出现问题,比较顺利的调试成功. 4.2有些函数不写系统会自己生成,为了避免出错自己写了上去只是声名并没有定义,如果用了编译器会报错. 4.3算法改进: 伪随机探查法能够消除基本聚集,但是如果两个关键子有相同的基位置,那么他们就有同样的探查序列.采用双散列法能够避免这样,双散列函数使用两个和散列函数,第一个探查序列的起始值,第二个计算下一个位置的探查步长. 4.4经验体会: 借助DEBUG调试器和数据观察窗口,可以加快找到程序中的错误,采用软件工程的方法将程序划分层次结构使得代码设计时思路清晰,实现时调试顺利,得到了一次良好的程序设计训练. 测试结果: 输入要输入的人名总数: 30 输入人名: 输入人名: ASDGHmochengcheng 输入非法,输入人名: 输入人名: #$%^&qwrdgeyuwei 输入非法,输入人名: 输入人名: zhuangshuangshuangshuangzhouruifeng 输入非法,输入人名: 输入人名: Zhuangyunwangqi 输入非法,输入人名: 输入人名: zhangyunzhangxiuhua 输入人名: 输入人名: yuanyanxiongliying 输入人名: 输入人名: mengxiangyinleiyang 输入人名: 输入人名: wuxudonghanbingfeng输入人名: 输入人名: chenghushengyaoboyu 输入人名: 输入人名: liyingtaolvxiaohu 输入人名: 输入人名: liutonghuanglei 输入人名: 输入人名: wangyinglizhouxiong 输入人名: 输入人名: lixiangzhangxinxin 输入人名: 输入人名: hexuyangyuman 输入人名: 输入人名: linyouluzhangyao 输入人名: 输入人名: zhangxiaozhangchao 输入人名: 输入人名: chenzhiwangxinyu 输入人名: dongchaoxun 输入查找人名: zhuangzhuangzhuangfsff 输入非法,再次输入人名 qwer45465 输入非法,再次输入人名 $Zhff 输入非法,再次输入人名 mochengcheng 查找成功 继续? yes--1.no--0 1 输入查找人名: zhangyun 查找成功 继续? yes--1.no--0 1 输入查找人名: zhanglei 查找失败 继续? yes--1.no--0 1 输入查找人名: leiyang 查找成功 继续? yes--1.no--0 0 附录 hashList.h哈希表的声名 hashList.cpp哈希表的定义 test.cpp主程序 hashList.h文件 /************************************************* 针对某个集体中的人名设计一个哈希表,使得平均查找长度不超过R 假设待填入哈希表的人名有30个,平均查找长度为2。 哈希表用除留余数法构造,用伪随机探测在散列法处理冲突。 ***************************************************/ #ifndefHASHLIST #defineHASHLIST #include #include #include usingnamespacestd; classHashList_T { public: HashList_T(intnumbers=1); HashList_T(constHashList_T&rhs); ~HashList_T(void); HashList_T&operator=(constHashList_T&rhs); //创建哈希表 voidcreateHashList(void); //非法数据的检验 boolisLegal(string&s); voidshow(boollhs)const; //查找特定姓名 voidfindName(void); //得到索引号 intgetNumber(string&s); //第i行是否存在字符串s boolisExistence(inti,string&s); boolisFull(inti)const; private: voidfindName(string&s); vector intm_numbers; }; #endif hashList.cpp #include"hashList.h" HashList_T: : HashList_T(intnumbers) { m_numbers=numbers; m_name_ptr=newvector } HashList_T: : ~HashList_T(void) { delete[]m_name_ptr; } boolHashList_T: : isLegal(string&s) { if(s.size()>18) returnfalse; for(inti=0;i { if(s[i]<'a'||s[i]>'z') returnfalse; } returntrue; } voidHashList_T: : show(boollhs)const { if(lhs) cout<<"查找成功"< else cout<<"查找失败"< } boolHashList_T: : isFull(inti)const { if(m_name_ptr[i].size()==2) returntrue; else returnfalse; } intHashList_T: : getNumber(string&s) { inti=s.size()%m_numbers; boolresult=isFull(i); if(! result) returni; else { intj; if(m_numbers%2==0) j=m_numbers-1; else j=m_numbers-2; i=(i+j)%m_numbers; result=isFull(i); while(result) { i=(i+j)%m_numbers; result=isFull(i); } returni; } } voidHashList_T: : createHashList(void) { inti=0,numbers; stringname; cout<<"输入要输入的人名总数: "< cin>>numbers; while(i { if (1) { strings; cout<<"输入人名: "< cin>>s; name=s; } boolresult=isLegal(name); while(! result) { if (1) { strings; cout<<"输入非法,输入人名: "< cin>>s; name=s; } result=isLegal(name); } intj=getNumber(name); m_name_ptr[j].push_back(name); i++; } } voidHashList_T: : findName(void) { stringname; inti=1; while(i>0) { if (1) { strings; cout<<"输入查找人名"< cin>>s; name=s; } boolresult=isLegal(name); while(! result) { if (1) { strings; cout<<"输入非法,再次输入人名"< cin>>s; name=s; result=isLegal(name); } } findName(name); cout<<"继续? yes--1.no--0"< cin>>i; } } voidHashList_T: : findName(string&s) { inti=s.size()%m_numbers; boolresult=isExistence(i,s); show(result); cout< } boolHashList_T: : isExistence(inti,string&s) { if(m_name_ptr[i].empty()) returnfalse; vector : iteratorp; intj; if(m_numbers%2==0) j=m_numbers-1; else j=m_numbers-2; while(! m_name_ptr[i].empty()) { p=m_name_ptr[i].begin(); while(p! =m_name_ptr[i].end()) { if(*p==s) returntrue; p++; } i=(i+j)%m_numbers; } returnfalse; } test.cpp主程序 #include"hashList.h" voidmain() { HashList_Thash(18); hash.createHashList(); hash.findName(); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 哈希表 课程设计 报告