- 1、本文档共12页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
哈希表与一般查找方法比较及冲突解决
哈希表与一般查找方法比较及冲突解决
[摘 要] 众所周知,在表中查找记录时需进行查找值和关键字的比较。这一类查找方法建立在“比较”的基础上。一般的查找方法有:顺序查找、折半查找、二叉查找。查找的效率依赖于查找过程中所进行的比较次数,甚至有一些数据的位置会影响某一次查找效率。理想的是希望不经任何比较,一次存取便能得到所需查找的记录。这个理想的情况可以通过哈希表来实现。
[关键词] 哈希表;哈希函数;冲突;查找;关键字
[中图分类号] TP301.6
[文献标识码] A
[文章编号] 1008-4738(2007)05-0096-03
1 一般查找方法的介绍
在现实生活中有不少查找数据的例子,如在学生成绩表中查找某一学生的成绩;在集体宿舍的名单中找到某个人所在的宿舍等。前人已在这些现实的例子中找到不少适合用计算机去查找的方法,如:顺序查找、折半查找等。
最容易理解的莫过于按照顺序查找,它的查找过程为:从表中的第一个记录开始,逐个地进行记录的关键字和给定值的比较,若某个记录的关键字和给定值的比较相等,则查找成功。反之,若直至最后一个记录,其关键字和给定值的比较都不相等,则表明表中没有给定值,这种方法可用在学生成绩表中查找某一学生的成绩。
从上面的例子可知顺序查找方法效率不高,但是我们还有其他查找方法,如:折半查找,它是建立在数据存放有序的基础上的,过程是:先确定待查记录所在范围,然后逐步缩小范围直到找到或找不到该记录为止。这类似我们在书中找某一页的过程,比如有一本非常厚的书(3 000),要找到1 076页,我们一般会翻到书的中间,看一下当前页数为多少,假如是1 400页,那么你就会缩小查找的范围(从第1页到1 400页),接着又在这个范围中用相同的方法找。
1.1 一般的查找方法存在的缺点
就拿顺序查找方法来看,假如表中有大量的数据,用这个方法效率很低,最差的情况就是要查找的数据在表的最后,这样就需要把所有的数据都读一遍。而折半查找方法虽然比顺序查找方法快很多,但对于大量数据来说,比较次数也会随着数据的数量变大而增多,并且如果要查找的数据在表的开始,反而这时的查找速度还不如顺序查找方法。
1.2 哈希表的提出
从上面的方法来看,影响查找速度的关键因素是在查找的过程中,记录的关键字和给定值的比较的次数。所以可以这样说:比较的次数越多,查找时间越长。理想的情况是希望不经任何比较,一次存取便能得到所查找的记录。而这个理想的情况可以用哈希表和它的算法来实现。
2 哈希表的概念
如果希望不经过任何比较,一次存取便能得到所查记录,那就必须在记录的存储位置和它的关键字之间建立一个确定的对应关系F,使每个关键字和唯一的存储位置相对应。因而在查找时,只要根据这个对应关系F就能找到给定值K的像F(K)。若表中存在关键字和K相等的记录,则必定在F(K)的存储位置上。其实换个说法,就是通过函数F(),算出要查找关键字K的存储位置F(K),这样就实现了不需要进行比较便可直接取得查找记录。在此,我们称这个对应关系F为哈希函数,按这个思路而建立的表为哈希表。
值得一提的是,哈希函数不是唯一的,我们可以根据要存取数据的具体情况自己构造一个。
2.1 哈希表的应用举例
假设有这些关键字:28,32,45,31,77。存放在A(10)这个数组中,我们可构造这样的哈希函数F(X)=X MOD 10(这个函数的意思为X对10求余,假如 X=42,那么F(X)=2),那么我们可知F(28)=8,F(32)=2,F(45)=5,F(31)=1,F(77)=7,而这些8,2,5,1,7就是这些关键字的存放地址。然后我们根据这些地址将关键字存放在数组A(10),图如下:
数组A(10)就是由哈希函数F(X)构成的哈希表。假如我们要查找关键字77,只需通过函数F(77)=7,就知77放在数组A中下标为7的位置。这样我们就可以不需要进行任何比较就能很快地在表中找到相应的数据。
2.2 哈希函数的冲突
对不同的关键字可能得到同一个哈希地址,如上例的关键字中假设还有一个关键字为22,那么F(22)=2,这正好与关键字32的地址一样F(32)=2,这种现象称为冲突。那么22这个新的数应放到哪里呢?
然而,在以住,我们都认为冲突只能尽可能地少,而不能完全地避免。
3 解决冲突的前提
任何方法的可行性都有前提,没有完全绝对的方法。当然这里介绍的方法也有前提:
第一:要存放的数据要尽量集中,不能太过分散,如:7,13,20,17这些数据的数值差距不大,比较集中。
第二:需要计算机的储
文档评论(0)