完整版数据结构哈希表实验报告.docx

上传人:b****5 文档编号:4605068 上传时间:2022-12-07 格式:DOCX 页数:8 大小:119.78KB
下载 相关 举报
完整版数据结构哈希表实验报告.docx_第1页
第1页 / 共8页
完整版数据结构哈希表实验报告.docx_第2页
第2页 / 共8页
完整版数据结构哈希表实验报告.docx_第3页
第3页 / 共8页
完整版数据结构哈希表实验报告.docx_第4页
第4页 / 共8页
完整版数据结构哈希表实验报告.docx_第5页
第5页 / 共8页
点击查看更多>>
下载资源
资源描述

完整版数据结构哈希表实验报告.docx

《完整版数据结构哈希表实验报告.docx》由会员分享,可在线阅读,更多相关《完整版数据结构哈希表实验报告.docx(8页珍藏版)》请在冰豆网上搜索。

完整版数据结构哈希表实验报告.docx

完整版数据结构哈希表实验报告

课程实习报告

 

 

题目

哈希表

学生姓名

唐鹏

学生学号

201208080216

专业班级

物联2班

指导老师

吴帆

完成日期

2014年4月2日

一、需求分析:

1.本程序来自于图书馆靠书名来检索想要查找的书问题。

2.本程序要求:

(1)根据输入建立图书名称表,米用创建散列表实现

(2)建散列表后,如果想要查找的数据在散列表中输出yes否则输出no。

二哈希表简介

结构中存在关键字和K相等的记录,则必定存储在f(K)的位置上。

由此,不需比较便

可直接取得所查记录。

这个对应关系f称为散列函数(Hashfunction),按这个思想建立的

表为散歹y表。

*对不同的关键字可能得到同一散列地址,即keyl工key2,而f(key1)=f(key2),这种现

象称冲突。

具有相同函数值的关键字对该散列函数来说称做同义词。

*综上所述,根据散列函数H(key)和处理冲突的方法将一组关键字映象到一个有限的连续的地址集(区间)上,并以关键字在地址集中的“象”,作为这条记录在表中的存储位置,

这种表便称为散列表,这一映象过程称为散列造表或散列,所得的存储位置称散列地址。

个现象也叫散列桶,在散列桶中,只能通过顺序的方式来查找,一般只需要查找三次就可以

找到。

科学家计算过,当负载因子(loadfactor)不超过75%查找效率最高。

*若对于关键字集合中的任一个关键字,经散列函数映象到地址集合中任何一个地址的概率是相等的,则称此类散列函数为均匀散列函数(UniformHashfunction),这就是使关键

字经过散列函数得到一个“随机的地址”,从而减少冲突。

程序设计流程

程序思想

(一)哈希函数unsignedinthash_BKDE(char*str)生成映射地址,成为散

列表的编号

(二)哈希表HashTable:

:

HashTable()通过数组储存元素

(三)插入函数voidHashTable:

:

insert(char*c)插入字符串,先计算要插入字符串生成的映射地址,然后在相应的地址插入,如果没有空位查找空位插入。

(四)查找函数boolHashTable:

:

find(char*c)进行查找,先计算要生成字符串的地址,再到散列表中进行查找比较。

(五)主函数main()

1)输入:

输入散列表内容和要查找的数据个数和数据

2)输出模块:

散列表查找的结果。

3)建散列表并查找:

建立散列表并递归查找

流程图

插入insert(^

查找find(卜

三.实验源程序:

#include#include

#includeusingnamespacestd;

哈希函数,题目给出

unsignedinthash_BKDE(char*str)〃

//初始种子seed可取31131131313131131313etc..

unsignedintseed=131;

unsignedinthash=0;

while(*str)

{

hash=hash*seed+(*str++);

}

return(hash&0x7FFFFFFF);

}

doublek=(double)(rand()%999)/1000;//随机生成小数随机数0

unsignedinthash_rand(unsignedintvalue)//value<2A32,将转化地址

转化为seed

{

doublea=k*value;

doublen=(a-(int)a)*64;//取小数部分与2A5相乘

unsignedintseed=(int)n;

returnseed;

}

unsignedintHash(char*str)//生成最终的地址映射即计算散列地址位置

{

returnhash_rand(hash_BKDE(str));

classHashTable//哈希表类

{

public:

HashTable();

~HashTable();

voidinsert(char*c);

boolfind(char*c);

private:

char**Arr;//二维数组用于保存字符串书名

intArrSize;//散列表单元个数在此为2八15=32768

};

HashTable:

:

HashTable()

{

ArrSize=32768;

Arr=newchar*[64];

for(inti=0;i<64;i++)

{

Arr[i]=newchar[100];

Arr[i]=NULL;

}

HashTable:

:

~HashTable()

{

for(inti=0;i<64;i++)

delete[]Arr[i];

delete[]Arr;

}

voidHashTable:

:

insert(char*c)//插入到哈希表

{

unsignedintpos=Hash(c);//计算散列地址位置

while(Arr[pos]!

=NULL)

pos=(pos+1);//解决冲突的办法,寻找空位,向后面挪动一个

Arr[pos]=c;//插入存储

}

boolHashTable:

:

find(char*c)//查找

{

unsignedintpos=Hash(c);//计算散列地址

while(Arr[pos]!

=NULL)//非空时进行查找比较

{

if(Arr[pos]==c)returntrue;

pos=(pos+1);//寻找下一地址,如果运行这一步,这说明之前产生了

冲突

returnfalse;

}

intmain()

{

boola[20];

char*c1=newchar[100];

HashTableH;

cout<<"输入字符串个数n:

\n";

intn;

cin>>n;

cout<<"输入n个字符串:

\n";

for(inti=1;i<=n;i++)

{

cin>>c1;

H.insert(c1);//直接插入到散列表的数组中

}

cout<<"输入待查的字符串个数m:

\n";

intm;

cin>>m;

cout<<"输入要查找的字符串:

"<

for(intj=0;j

cin>>c1;

a[j]=H.find(c1);//bool量

}

coutvv"查找结果(yes表示存在,no表示不存在):

\n";

for(intk=0;k

if(a[k])

cout«"yes\n";

else

cout«"No\n";

return0;

四、实验截图

五、实验感想

本次的实验首先要弄清楚哈希表,然后弄清楚最关键的两个模块,插入和查找插入模块中,首先要有哈希函数生成映射地址,要有哈希表保存元素,然后就是自己设定的解决冲突的办法,这个程序是采用向下挪动一个办法,直到找到为空的地方保存。

在查找中也是,先要通过哈希函数生成映射地址,通过这个地址参看哈希表中时候有元素,考虑到会有冲突的产生,那么必须那么必须要通过循环查找,要么找到元素,否则直到为空跳出查找。

这也是这个程序的难点所在。

总体来说,哈希表对于提高储存和查找效率方面有很大的提升。

实验难度不是很大。

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

当前位置:首页 > 高中教育 > 高中教育

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

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