湖南大学数据结构实验报告哈希表

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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);

相关文档
最新文档