联系hashgameCONTACT hashgame
地址:广东省广州市
手机:13988889999
电话:020-88889999
邮箱:admin@qq.com
查看更多
Rhashgamehashgame
你的位置: 首页 > hashgame

计算式查找(哈希表构造)dHASH GAME - Online Skill Game ET 300ocx

发布时间:2025-12-12 20:30:07  点击量:

  HASH GAME - Online Skill Game GET 300

计算式查找(哈希表构造)dHASH GAME - Online Skill Game GET 300ocx

  第 4 讲 计算式查找(哈希表的构造)——教学讲义 哈希法 又称 散列法、杂凑法 或关键字地址计算法 等,相应的表称为 哈希表、散列表、 杂凑表 等。这种方法的 基本思想 是:首先在元素的关键字 k 和元素的存储位置 p 之间建立一 个对应关系 H,使得 p=H (k),H 称为哈希函数 。创建哈希表时,把关键字为 k 的元素直接存 入地址为 H (k)的单元;以后当查找关键字为 k 的元素时,再利用哈希函数计算出该元素的 存储位置 p=H (k) ,从而达到按关键字直接存取元素的目的。 当关键字集合很大时,关键字值不同的元素可能会映象到哈希表的同一地址上,即  k1 ≠ k2 ,但 H(k1)=H(k2),这种现象称为 冲突, 此时称 k1 和 k2 为同义词。 实际中,冲突是不可避免的,只能通过改进哈希函数的性能来减少冲突。 综上所述,哈希法主要包括以下两方面的内容: 1) 如何构造哈希函数 2) 如何处理冲突。 一、 哈希函数的构造方法 构造哈希函数的原则是: ①函数本身便于计算; ②计算出来的地址分布均匀, 即对任一 关键字 k,H (k) 对应不同地址的概率相等,目的是尽可能减少冲突。 下面介绍构造哈希函数常用的五种方法。 1. 数字分析法 如果事先知道关键字集合, 并且每个关键字的位数比哈希表的地址码位数多时,  可以 从关键字中选出分布较均匀的若干位,构成哈希地址。例如,有 80 个记录,关键字为 8 位 十进制整数 d1d2d3?d7d8,如哈希表长度取为 100,则哈希表的地址空间为: 0~99。假设经过 分析,各关键字中 d4 和 d7 的取值分布较均匀, 则哈希函数为: H (key)= H (d1d2d3?d7d8)=d4d 7。 例如, H =43 ,H =06 。相反,假设经过分析,各关键字中 d1 和 d 8 的取 值 分 布极 不 均匀 , d1 都等 于 5 , d8 都 等 于 2 , 此时, 如 果哈 希 函 数 为 : H (key)= H (d1 d2d3?d7d8)=d1d 8,则所有关键字的地址码都是 52,显然不可取。 2. 平方取中法 当无法确定关键字中哪几位分布较均匀时,可以先求出关键字的平方值,然后按需 要取平方值的中间几位作为哈希地址。 这是因为:平方后中间几位和关键字中每一位都相关, 故不同关键字会以较高的概率产生不同的哈希地址。 例:我们把英文字母在字母表中的位置序号作为该英文字母的内部编码。例如  K 的 内部编码为 11, E的内部编码为 05,Y 的内部编码为 25,A 的内部编码为 01, B 的内部编码 为 02。由此组成关键字 “ KEYA” 的内部代码为 ,同理我们可以得到关键字 “ KYAB”、 “ AKEY”、“ BKEY” 的内部编码。之后对关键字进行平方运算后,取出第 7 到第 9 位作为该 关键字哈希地址,如下图所示。 关键字 内部编码 内部编码的平方值 H(k)关键字的哈希地址 KEYA 778 KYAB 795 AKEY 265 BKEY 315 平方取中法求得的哈希地址 3. 分段叠加法 这种方法是按哈希表地址位数将关键字分成位数相等的几部分(最后一部分可以较短)  , 然后将这几部分相加, 舍弃最高进位后的结果就是该关键字的哈希地址。 具体方法有 折叠法 与移位法。 移位法是将分割后的每部分低位对齐相加, 折叠法是从一端向另一端沿分割界来 回折叠 (奇数段为正序, 偶数段为倒序) ,然后将各段相加。 例如: key=65, 哈希表长度为 1000 ,则应把关键字分成 3 位一段,在此舍去最低的两位 65 ,分别进行移位 叠加和折叠叠加,求得哈希地址为 105 和 907,如下图所示。 1 2 3 1 2 3 6 0 3 3 0 6 2 4 7 2 4 7 1 1 2 2 1 1 +) 0 2 0 +) 0 2 0 ———————— ————————— 1 1 0 5 9 0 7 (a) 移位叠加 (b) 折叠叠加 由叠加法求哈希地址 4. 除留余数法 假设哈希表长为 m ,p 为小于等于 m 的最大素数,则哈希函数为 h(k)=k % p ,其中 %为模 p 取余运算。 例如,已知待散列元素为( 18,75,60,43,54, 90,46),表长 m=10,p=7,则有 h(18)=18 %7=4 h(75)=75 %7=5 h(60)=60 %7=4 h(43)=43 %7=1 h(54)=54 %7=5 h(90)=90 %7=6 h(46)=46 %7=4 此时冲突较多。为减少冲突,可取较大的  m 值和 p 值,如 m=p=13,结果如下: h(18)=18 %13=5 h(75)=75 %13=10 h(60)=60 %13=8 h(43)=43 %13=4 h(54)=54 %13=2 h(90)=90 %13=12 h(46)=46 %13=7 此时没有冲突,如下图所示。 0 1 2 3 4 5 6 7 8 9 10 11 12 54 43 18 46 60 75 90 除留余数法求哈希地址 5. 伪随机数法 采用一个伪随机函数做哈希函数,即  H(key)=random(key) 。 在实际应用中,应根据具体情况,灵活采用不同的方法,并用实际数据测试它的性能, 以便做出正确判定。通常应考虑以下五个因素 : 计算哈希函数所需的时间。 关键字的长度。 哈希表的大小。 关键字分布的情况。 记录查找的频率 8.4.2 处理冲突的方法 通过构造性能良好的哈希函数, 可以减少冲突, 但一般不可能完全避免冲突, 因此解决 冲突是哈希法的另一个关键问题。 创建哈希表和查找哈希表都会遇到冲突, 两种情况下解决 冲突的方法应该一致。 下面以创建哈希表为例, 说明解决冲突的方法。 常用的解决冲突方法有以下四种: 1. 开放定址法 这种方法也称 再散列法, 其基本思想是:当关键字 key 的初始哈希地址 h0= H( key) 出现冲突时,以 h0 为基础,产生另一个地址 h1,如果 h 1 仍然冲突,再以 h0 为基础,产生另 一个哈希地址 h2,?,直到找出一个不冲突的地址 hi ,将相应元素存入其中。这种方法有 一个通用的再散列函数形式: hi=(H( key) +di) %m  i=1 , 2,?, n 或: hi=(

【返回列表页】

顶部

地址:广东省广州市  电话:020-88889999 手机:13988889999
Copyright © 2018-2025 哈希游戏(hash game)官方网站 版权所有 非商用版本 ICP备案编: