码迷,mamicode.com
首页 > 其他好文 > 详细

哈希表

时间:2015-04-25 12:14:33      阅读:148      评论:0      收藏:0      [点我收藏+]

标签:

基本思想:在记录的存储地址和它的关键字之间建立一个确定的对应关系;这样,不经过比较,一次存取就能得到所查元素的查找方法。

哈希函数:

                   在记录的关键字与记录的存储地址之间建立的一种对应关系叫哈希函数。

                   哈希函数是一种映象,是从关键字空间到存储地址空间的一种映象。可写成:addr(ai) = H(ki)  ,其中ii是表中一个元素,

                   addr(ai)是aaii的地址,kkii是aaii的关键字。

哈希表:

                    应用哈希函数,由记录的关键字确定记录在表中的地址,并将记录放入此地址,这样构成的表叫哈希表。

哈希查找(又叫散列查找):

                   利用哈希函数进行查找的过程叫哈希查找。

                    冲突 :对于不同的关键字 ki、kj,,若ki≠≠kj,但,H(ki) = H(kj) 的现象叫冲突(collision) 。

                    同义词 :具有相同函数值的两个不同的关键字,称为该哈希函数的 同义词 。

                    哈希函数通常是一种压缩映象,所以冲突不可避免,只能尽量减少;当冲突发生时,应该有处理冲突的方法 。

                   设计一个散列表应包括 :
                         ① 散列表的空间范围 ,即确定散列函数的值域 ;
                         ② 构造合适的散列函数,使得对于所有可能的元素(记录的关键字),函数值均在散列表的地址空间范围内,且出现冲突的可能尽量小;
                         ③ 处理冲突的方法 。即当冲突出现时如何解决 。

哈希函数的构造:

                  哈希函数是一种映象,其设定很灵活,只要使任何关键字哈希函数值都落在表长允许的范围之内即可。

                  哈希函数““好坏””的主要评价因素有:

                   ◆散列函数的构造简单;
                   ◆能“均匀”地将散列表中的关键字映射到地址空间。所谓“均匀”(uniform)是指发生冲突的可能性尽可能最少。

                    1 直接定址法

                                 取关键字或关键字的某个线性函数作哈希地址,H(key)=key 或H(key) =a·key+b(a,b 为常数)
                                 特点::直接定址法所得地址集合与关键字集合大小相等,不会发生冲突,但实际中很少使用。

                    2 平方取中法
                                将关键字平方后取中间几位作为哈希地址。
                                 一个数平方后中间几位和数的每一位都有关,则由随机分布的关键字得到的散列地址也是随机的。散列函数所取的位数由散列表

                                 的长度决定。这种方法适于不知道全部关键字情况,是一种较为常用的方法。

                   3 除留余数法
                              取关键字被某个不大于哈希表表长m的数p除后所得余数作哈希地址,即H(keyH(key)=key MOD p )=((pp≤≤mm))
                              是一种简单、常用的哈希函数构造方法。
                              利用这种方法的关键是p的选取,p选的不好,容易产生同义词。p的选取的分析:
                             ◆选取p=2i(p≤m)):运算便于用移位来实现,但等于将关键字的高位忽略而仅留下低位二进制数。

                                                                  高位不同而低位相同的关键字是同义词。
                             ◆选取p=q×f(q、f都是质因数,p≤m):则所有:含有q或f因子的关键字的散列地址均是q或f的倍数。

                             ◆ 选取p为素数或p=q×f (q、f是质数且均大于20,p≤m):常用的选取方法,能减少冲突出现的可能性。

                   4 随机数法
                             取关键字的随机函数值作哈希地址,即H(key) = random(key) 当散列表中关键字长度不等时,该方法比较合适 。

                    选取哈希函数 ,考虑以下因素
                             ◆ 计算哈希函数所需时间;
                             ◆ 关键字的长度;
                             ◆ 哈希表长度(哈希地址范围);
                             ◆ 关键字分布情况;
                             ◆ 记录的查找频率 。

冲突处理的方法

                   冲突处理:当出现冲突时,为冲突元素找到另一个存储位置。

1 开放定址法

                    基本方法:当冲突发生时,形成某个探测序列;按此序列逐个探测散列表中的其他地址,直到找到给定的关键字或一个空地址(
                                        开放的地址)为止,将发生冲突的记录放到该地址中。散列地址的计算公式是:
                                         Hi(key) = ( H(key)+d ) MOD m )      m,i=1, 2, ……, ,k( k≤m--1)
                                         其中:H(key):哈希函数;m:散列表长度;
                                         di:第:i次探测时的增量序列;
                                         Hi(key ) :经第i次探测后得到的散列地址。

                    ⑴ 线性探测法
                                 将散列表 T[0 ……m--1]看成循环向量。当发生冲突时,,从初次发生冲突的位置依次向后探测其他的地址。
                                 增量序列为: dii=1, 2, 3, =……, m, m--1
                                设初次发生冲突的地址是 h,则依次探测 ,T[h+1],,T[h+2]……,直到,T[mT[m--1]时又循环到表头,再次探测

                                 T[0],,T[1]……,直到,T[h--1]。探测过程终止的情况是:
                                ◆ 探测到的地址为空 :表中没有记录 。若是查找则失败 ;若是插入则将记录写入到该地址 ;
                                ◆ 探测到的地址有给定的关键字 :若是查找则成功;若是插入则失败 ;

                                ◆直到T[h]:仍未探测到空地址或给定的关键字,散列表满。
                                 例1 :设散列表长为7,记录关键字组为:15, 14, 28, 26, 56, 23,散列函数:H(key)=key MOD 7,冲突处理采用线性探测法。
                                             解:H(15)=15 MOD 7=1            H(14)=14 MOD 7=0
                                                     H(28)=28 MOD 7=0  冲突  H1(28)=1 又冲突

                                                     H2(28)=2 H(26)=26 MOD 7=5
                                                     H(56)=56 MOD 7=0 冲突H1(56)=1 又冲突
                                                     H2(56)=2 又冲突H3(56)=3
                                                     H(23)=23 MOD 7=2 冲突H1(23)=3 又冲突

                                                     H3(23)=4
                                                     0  1   2    3    4   5   6

                                                    14 15 28 56 23 26

                            线性探测法的特点
                                     ◆ 优点 :只要散列表未满 ,总能找到一个不冲突的散列地址;
                                     ◆ 缺点 :每个产生冲突的记录被散列到离冲突最近的空地址
                                                       上,从而又 增加了更多的冲突机会 (这种现象称为冲突的“聚集”)。

                     ⑵ 二次探测法

                     ⑶伪随机探测法

2 再哈希法

3 链地址法

4 建立公共溢出区

哈希表

标签:

原文地址:http://blog.csdn.net/meiyoudao_jiushidao/article/details/45268519

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!