湖南大学数据结构实验报告哈希表
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
HUNAN UNIVERSITY
课程实验报告
题目
散列表
学生姓名
肖倩
学生学号20110801323 专业班级
计科三班
指导老师
吴帆
一、需求分析
1.根据输入建立图书名称表,采
用散列表实现该表,散列函数
自建。
2.数据的输入输出格式:
输入分为两部分
输入:
第一部分,第一行是行数n,n <= 5000。余下n行,每行一个字符串。表示已存在的图书记录。
第二部分,第一行是行数m,m <= 1000。余下m行,每行一个字符串。表示要查询的图书记录。
输出:
输出为m行,如果被查的记录存在,则输出"YES",如果不存在则输出"NO"。
3.测试数据
输入:
4
a
ans
and
hellocpp
9
a
b
an
as
ans
and
ande
hellocbb
hellocpp
输出:
YES
NO
NO
NO
YES
YES
NO
NO
YES
二、概要设计
抽象数据类型
class Node//最基本的抽象数据类型
{
public:
char ch[20];//链表中,记录表中数据,20为查找字符串的长度
Node* next;//指向下一个结点
Node(const char* in);//构造函数
};
class List{ //用Node作结点的链表
public:
Node* head;
Node* tail;
Node* fence;
List();
~List();
bool append(const char* in);//像链表中,增添结点
};
class Hash//哈希表的详细设计
{
private:
List* myList;//指向链表数组public:
int getSubInt(const char* in)
const; //哈希函数,把传进
的字符串的ASCII //相加,
再mod哈西表大小,得该字
符串的位置
Hash();
~Hash();
bool insert(const char*) const;//建立哈希表
bool find(const char*) const;//在哈希表中查找
};
int Hash::getSubInt(const char *in) const//哈希函数的实现
{
int sum=0,i=0;
while(in[i]!='\0')
sum+=in[i++];
return sum%tableSize;
}
算法的基本思想
本程序采用了开散列表,用一个
链表数组实现。链表的每一个结点,储存要查询的字符串和下一个结点的指针。哈西函数,由字符串的每个字符的ASCII码相加并模哈希表大小来实现。
程序的流程图
程序分为两大块:建表模块和查找模块,哈希函数是两模块公用的。
算法的时空分析
因为哈希函数的时间复杂度为Θ(1),所以时间复杂度取决于每个链表的长度,时间复杂度为Θ(n)。
输入和输出的格式
输入
建立哈希表://提示
n= //提示
等待输入
输出
查询次数: //提示
n= //提示
等待输入
YES/NO
四、运行结果
这个实验,代码中出现问题最多的是使用空指针进行相应的操作,造成无法调试。解决方法简单,对相应指针进行赋值即可。
另外,此实验中,原始用的哈希函数不太理想。原始哈希函数是字符串首字母,依次使用哈希表的每一个槽。在查找时,也是逐个检查每个槽的首字母,匹配时,查找该槽的链表。改进后,不用逐个查找槽的首字母,使查找效率有相应的提高。
建表模块
六、附录(程序源码)
/***各抽象数据类型定义***/
class Node
{
public:
char ch[20];
Node* next;
Node(const char* in);
};
class List
{
public:
Node* head;
Node* tail;
Node* fence;
List();
~List();
bool append(const char* in);
};
class Hash
{
private:
List* myList;
public:
int getSubInt(const char* in) const;
Hash();
~Hash();
bool insert(const char*) const;
bool find(const char*) const;
};
/****各成员函数函数体****/
const int tableSize=26;
Node::Node(const char* in) //结点定义{
strcpy(ch,in);
next=NULL;
}
List::List()
{
fence=head=tail=NULL;
}
List::~List()
{
Node* temp;
while(head!=NULL)
{
temp=head;
head=head->next;
delete temp;
}
}
bool List::append(const char* in) //在链表//尾增添结点
{
if(head==NULL)
{
head=tail=new Node(in);
return true;
}
tail=tail->next=new Node(in);
return true;
}
Hash::Hash()
{
myList=new List[tableSize];
}
bool Hash::insert(const char* value) const {
int i=getSubInt(value);
if(find(value))
return false;
myList[i].append(value);