实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计报告
题目:散列表的设计与实现
学生姓名:管宁
学号:09110208
班级:091102
指导教师:张军邹国华
2011年5月28日
目录
1.需求分析说明 (1)
1.1.实验目的 (1)
1.2.理论知识 (1)
1.3.实验内容 (2)
1.4.基本要求 (4)
1.5.进一步完成内 (4)
2.总体设计 (4)
3.详细设计 (5)
4.实现部分 (6)
5.程序测试 (12)
6.总结 (17)
(一)、需求分析说明
(1)【实验目的】
学习掌握散列表的基本思想。
学会应用散列表
(2)【理论知识】
散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
用的构造散列函数的方法
散列函数能使对一个数据序列的访问过程更加迅速有效,通过散列函数,数据元素将被更快地定位:
1. 直接寻址法:取关键字或关键字的某个线性函数值为散列地址。即H(key)=key或H(key) = a•key + b,其中a和b为常数(这种散列函数叫做自身函数)
2. 数字分析法:分析一组数据,比如一组员工的出生年月日,这时我们发现出生年月日的前几位数字大体相同,这样的话,出现冲突的几率就会很大,但是我们发现年月日的后几位表示月份和具体日期的数字差别很大,如果用后面的数字来构成散列地址,则冲突的几率会明显降低。因此数字分析法就是找出数字的规律,尽可能利用这些数据来构造冲突几率较低的散列地址。
3. 平方取中法:取关键字平方后的中间几位作为散列地址。
4. 折叠法:将关键字分割成位数相同的几部分,最后一部分位数可以不同,然后取这几部分的叠加和(去除进位)作为散列地址。
5. 随机数法:选择一随机函数,取关键字的随机值作为散列地址,通常用于关键字长度不同的场合。
6. 除留余数法:取关键字被某个不大于散列表表长m的数p除后所得的余数为散列
地址。即 H(key) = key MOD p, p<=m。不仅可以对关键字直接取模,也可在折叠、
平方取中等运算之后取模。对p的选择很重要,一般取素数或m,若p选的不好,容
易产生同义词。
处理冲突的方法
1. 开放寻址法:Hi=(H(key) + di) MOD m, i=1,2,…, k(k<=m-1),其中H(key)为
散列函数,m为散列表长,di为增量序列,可有下列三种取法:
1. di=1,2,3,…, m-1,称线性探测再散列;
2. di=1^2, -1^2, 2^2,-2^2, (3)^2, …, ±(k)^2,(k<=m/2)称二次探测再散列;
3. di=伪随机数序列,称伪随机探测再散列。 ==
2. 再散列法:Hi=RHi(key), i=1,2,…,k RHi均是不同的散列函数,即在同义词产生地址冲突时计算另一个散列函数地址,直到冲突不再发生,这种方法不易产生“聚集”,但增加了计算时间。
3. 链地址法(拉链法)
(3)【实验内容】
设计散列表实现电话号码查找系统
(4)【基本要求】
1)设每个记录有下列数据项:电话号码、用户名、地址;
2)从键盘输入各记录,分别以电话号码和用户名为关键字建立散列表;
3)采用一定的方法解决冲突;
4)查找并显示给定电话号码的记录;
5)查找并显示给定用户名的记录。
(5)【进一步完成内容】
1)系统功能的完善;
2)设计不同的散列函数,比较冲突率;
3)在散列函数确定的前提下,尝试各种不同类型处理冲突的方法,考察平均查找长度的变化。
(二)、总体设计
主要算法流程描述:
电话管理系统要整个系统的主要分为两大模块如功能模块图2-1可以清楚的看到,录入模块和查询模块。
录入模块可根据系统提示的信息填写信,,填完相应的信息,可按回车储存。以姓名和电话号码为关键字,分别用Hash函数运算出一个相对应的值,把这个值作为结点的存储地址,分别存入姓名散列表和电话号码散列表的对应位置。
查询模块分为两部分,姓名查询和号码查询,姓名查询可有一个姓名查到多个记录号码查询是一一映射。查找时,通过所要寻找的关键字用同样的Hash函数计算地址,判断存的内容是否跟关键字是否一样,若一样则记录找到则可找到你要查找的内容。否
则无此记录。
(三)详细设计
号码的查找,首先获得关键字key,用Hash1(key)计算出地址,比较对应num_Ht[d]
号码散列表的值是否和关键字相等,若相等则将该存储单元的所有内容输出,返回。
若不相等,则用探查序列的计算散列地址,则可找到所找记录。
姓名的查找,首先获得关键字key,用Hash1(key)计算出地址,比较Hah2(key)
的值是否和关键字相等,若相等则将该存储单元的所有内容输出,输出完,继续用探
查序列计算出散列地址,依依和关键字比较,输入已关键字相同的所有记录。过程几
乎与号码查询是一样的。如图3-1。
号码存储的散列函数Hash1(key),算出散列地址,若再碰到冲突。则用探查序列再计
算散列地址。探查序列为d(i)=(d+ih2(key))%m (1<=I<=m-1)。直到把记录存进去;
姓名的存储与号码是一样的
(四)实现部分
#include