哈希表课程设计报告.docx

上传人:b****7 文档编号:11200774 上传时间:2023-02-25 格式:DOCX 页数:20 大小:18.97KB
下载 相关 举报
哈希表课程设计报告.docx_第1页
第1页 / 共20页
哈希表课程设计报告.docx_第2页
第2页 / 共20页
哈希表课程设计报告.docx_第3页
第3页 / 共20页
哈希表课程设计报告.docx_第4页
第4页 / 共20页
哈希表课程设计报告.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

哈希表课程设计报告.docx

《哈希表课程设计报告.docx》由会员分享,可在线阅读,更多相关《哈希表课程设计报告.docx(20页珍藏版)》请在冰豆网上搜索。

哈希表课程设计报告.docx

哈希表课程设计报告

哈希表设计

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的向量组,每一组的数据个数不超过2个

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[m_numbers];

}

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*m_name_ptr;

intm_numbers;

};

#endif

hashList.cpp

#include"hashList.h"

HashList_T:

:

HashList_T(intnumbers)

{

m_numbers=numbers;

m_name_ptr=newvector[m_numbers];

}

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();

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 农学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1