- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
1 概述 2
2 原理介绍 2
2.1 散列表介绍 2
2.2 直接寻址表 3
2.3 散列函数 3
2.3.1 除法散列 4
2.3.2 乘法散列 4
2.3.3 全域散列 4
2.4 解决碰撞问题 5
2.4.1 链接法 5
2.4.2 开放寻址法 5
2.4.2.1 线性探查 6
2.4.2.2 二次探查 6
2.4.2.3 双重散列 7
3 算法说明 7
3.1 概述 7
3.2 使用链接法解决碰撞问题 8
3.2.1 算法思想 8
3.2.2 伪代码描述 9
3.2.3 算法分析与证明 10
3.3 使用开放寻址法的双重散列解决碰撞问题 12
3.3.1 算法思想 12
3.3.2 伪代码描述 12
3.3.3 算法分析与证明 14
3.4 两个算法的比较 14
4 实验设计与分析 16
5 C++实现与结果分析 18
5.1 C++实现与结果 18
5.2 结果分析 26
6 实验总结和感想 27
概述
该实验报告主要是通过介绍散列表的各种技术,包括散列函数、解决碰撞的机制等技术,并对两种解决碰撞的机制:链接法和开放寻址法进行分析和证明,并通过实验分析两者在不同的规模下的运行时间和空间占用的对比,来证明在“算法说明”一章中的理论分析。
原理介绍
散列表介绍
散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。它实际上是是普通数组概念的推广,因为可以对数组进行直接寻址,故可以而在O(1)时间内访问数组的任意元素。如果存储空间允许,我们可以提供一个数组,为每个可能的关键字保留一个位置,就可以应用直接寻址技术。
基本概念
若结构中存在关键字和K相等的记录,则必定在f(K)的存储位置上。由此,不需比较便可直接取得所查记录。称这个对应关系f为散列函数(Hash function),按这个思想建立的表为散列表。 对不同的关键字可能得到同一散列地址,即key1≠key2,而f(key1)=f(key2),这种现象称冲突。具有相同函数值的关键字对该散列函数来说称作同义词。综上所述,根据散列函数H(key)和处理冲突的方法将一组关键字映射到一个有限的连续的地址集(区间)上,并以关键字在地址集中的“象”作为记录在表中的存储位置,这种表便称为散列表,这一映射过程称为散列造表或散列,所得的存储位置称散列地址。 若对于关键字集合中的任一个关键字,经散列函数映射到地址集合中任何一个地址的概率是相等的,则称此类散列函数为均匀散列函数(Uniform Hash function),这就是使关键字经过散列函数得到一个“随机的地址”,从而减少冲突。 常用的构造散列函数的方法
散列函数能使对一个数据序列的访问过程更加迅速有效,通过散列函数,数据元素将被更快地定位
当实际存储的关键字数比可能的关键字总数较小时,此时采用散列表就会较直接数组寻找更为有效,因为散列表通常采用的数组尺寸与所要存储的关键字数十成比例的。在散列表中,不是直接把关键字用作数组下标,而是根据关键字计算出下标。
名词解释:
碰撞:就是指多个关键字映射到同一个数组下标位置
直接寻址表
当关键字的全域U比较小时,直接寻址是一种简单而有效的技术。假设某应用要用到一个动态集合,其中每个元素都有一个取自全域U={0,1,2,…}的关键字,此外M是一个不很大的数。另假设没有两个元素具有相同的关键字。
此时动态集合中的元素可以放在直接寻址表中。亦即不把每个元素的关键字及其卫星数据都放在直接讯指标外部的一个对象中,再由表中某个槽的指针指向该对象,而是直接把对象放在表的槽中,从而节省了空间。此外,通常不需要存储对象的关键字域,因为如果我们有了一个对象的在表中的下标,就可以得到它的关键字。但是,如果不存储关键字,我们必须有某种办法来确定某个槽是否为空。
一般来说,直接寻址法比较浪费存储空间,而且容易发生碰撞(当有关键字相等的时候)。这里不与讨论。
散列函数
好的散列函数的特点:
一个好的散列函数应(近似地)满足简单一致散列的假设:每个关键字都等可能地散列到m个槽位的任何一个之中去,并与其他得到关键字已被散列到哪一个槽位中无关。不幸的是,一般情况下不太可能检查这一条件是否成立,因为人们很少能知道关键字所符合的概率分布,而各关键字可能并不是完全相互独立的。
有时,我们偶尔也能知道关键字的概率分布。例如,如果已知各关键字都是随机的实数k,他们独立地、一致地分布于范围0=k1中,那么散列函数:
h(k)=[km]
就能满足简单一致散列这一假设条件。
将关键字解释为自然数:
一个字符串关键字可以被解释为按适当的基数记号表示的整数。一
文档评论(0)