发布时间:2025-04-19 21:34:29 点击量:
HASH GAME - Online Skill Game GET 300
哈希表的查找哈希表相关概念哈希函数的基本概念哈希表又称散列表哈希表存储的基本思想是以数据表中的每个记录的关键字为自变量通过一种函数计算出函数值把这个值解释为一块连续存储空间即数组空间的单元地址即下标将该记录存储到这个单元中在此称该函数为哈希函数或散列函数按这种方法建立的表称为哈希表或散列表理想情况下哈希函数在关键字和地址之间建立了一个一一对应关系从而使得查找只需一次计算即可完成由于关键字值的某种随机性使得这种一一对应关系难以发现或构造因而可能会出现不同的关键字对应一个存储地址即但这种现象称为冲突
哈希表(Hash)的查找 、哈希表相关概念 1、哈希函数的基本概念 哈希表又称散列表。 哈希表存储的基本思想是:以数据表中的每个记录的关键字 k 为自变量,通过一种函数 H(k) 计算出函数值。把这个值解释为一块 连续存储空间(即数组空间)的单元地址(即下标),将该记录存储到这个单元中。 在此称该函数H为哈希函数或散列函数。按这种 方法建立的表称为哈希表或散列表。 理想情况下,哈希函数在关键字和地址之间建立了一个一一对应关系,从而使得查找只需一次计算即可完成。由于关键字值的某 种随机性,使得这种一一对应关系难以发现或构造。因而可能会出现不同的关键字对应一个存储地址。即 klMk2,但H(k1)=H(k2), 这种现象称为冲突。把这种具有不同关键字值而具有相同哈希地址的对象称 “同义词”。 在大多数情况下,冲突是不能完全避免的。这是因为所有可能的关键字的集合可能比较大,而对应的地址数则可能比较少。 对于哈希技术,主要研究两个问题: 1)如何设计哈希函数以使冲突尽可能少地发生。 2)发生冲突后如何解决。 2、哈希函数的构造方法 常见的构造方法有很多种,如直接定址法,数字分析法,平方取中法等。接下来,我们介绍其中的几种: 1)除留余数法 取关键字k被某个不大于表长m的数P除后所得余数作为哈希函数地址的方法。即: (k )= k mod p 这种方法的关键是选择好P。使得数据集合中的每一个关键字通过该函数转化后映射到哈希表的任意地址上的概率相等。理论研 究表明,一般取P为小于m的最大质数 或不包含小于20的质因素的合数。 2)平方取中法 先将关键字平方,然后取其中间几位作为散列地址。所取位数由地址空间范围决定。若地址空间小于所取位数值决定的范围,可 通过乘以一比例因子来解决。 3)折叠法 把关键字分割成位数相等(最后一部分的位数可以不同)的几部分,然后通过折叠后将几部分进行相加,丢掉进位位,所得值即 为散列地址。散列的位数由地址空间的位数而定。 分割方法:从右至左 相加方法有两种: 移位叠加:将分割后的各部分低位对齐相加。 界间叠加:将某些部分倒置后再相加。相当于把关键字看成一张纸,从一端向另一端沿间界逐层折叠,再把相应位数相加。 3、哈希函数的冲突检测方法 假设哈希表的地址范围为0?m-l,当对给定的关键字k,由哈希函数H(k)算出的哈希地址为i( 0 i m-1)的位置上已存有记录, 这种情况就是冲突现象。 处理冲突就是为该关键字的记录找到另一个“空”的哈希地址。即通过一个新的哈希函数得到一个新的哈希地址。如果仍然发生 冲突,则再求下一个,依次类推。直至新的哈希地址不再发生冲突为止。 常用的处理冲突的方法有开放地址法、链地址法等几类。 1)开放地址法 当发生冲突时,将依次探测“下一个位置”,直到找到其关键字相匹配的元素或找到一个空位插入。设哈希空间长度为 一个位置”由下式确定: H i =(H(key)+d i) mod m H(key): 哈希函数 m: 哈希表长度 di:求“下一个位置”的增量 d i 的确定方法 线。 这种 di 的取法称为线性探测再散列。即“下一个位置”为哈希表的直接后继。若当 di=m-1 时仍未查到,则说明表满,还要查找另 外的溢出表。缺点:容易产生“二次聚集” 二次探测再散列 d i=12,-1 d i=12,-1 2,22,-2 2,, ,± k2 (k m/2) 伪随机探测再散列 d i 由一个伪随机函数发生器产生的一个伪随机数序列来确定。 2)链地址法 将所有关键字为同义词的记录存储在同一链表中。设哈希地址在区间 [0..m-1] 上,设置一个指针向量: Chain chainhash[m]; 每个分量的初始状态为空,凡哈希地址为 i 的的记录则插入到 chainhash[i] 的链表中。插入的位置可以在表头、表尾,也可在中 间。为了查找的方便,可以使同一链表中记录的关键字有序。如 K={19,14,23,01,68,20,84,27,55,11,10,79} H(key)=key mod 13 H(key)=key mod 13 ,存储链表如图中所示: 、哈希表C语言描述 0 1 2 3 4 5 6 7 S 9 A -一頁 51 二HRi A A A d i9 —M^l I A A ~H 10 1 23 I ;;lzj^Frpn A 〃——开玻定址哈希表的存储结构- int hashsize[ ] = I 997,. typedaf struct J * ?leBs count; sizeindex;ElewType * ?leBs count; sizeindex; int int iHashfTble; UNSUCCESS 0DUPLICATE ? UNSUCCESS 0 DUPLICATE ? 4t define 〃哈希表容量递增表?一个合适的素数序列 〃数据元索存储基址,动态分配数组 /I当前数据元素个数 〃 hashsizet sizeindex]为当前容量 StMua Insert Hash (HashTable AH. Elentype e) N査找不成功时?入?据元素e到开?定址呛希表H中,并返回OR;若冲突次? 〃过大,则直?咱希表 C ? Oi if HashSearch ( H, e. key, p, c )) 〃表中 〃表中e有与e有相同关《字的元素 (J冲突次坡C未达到上限,9的阀值可调) 〃 ?入仗 ?1M if ( c hashsizelH. Bizeindex]/2 ) \ H.elefl[pl = e;nt; returo OK; ?Jm ftecreataHshTiIle( H); 1〃 InsertHash Status ScaretiElash (H^shThi^ H* K^yTyp^ K* iitt p* lut 匚) if牲开放定址哈希$ ?中査找关键码为K的元it若査找成功?以p指示待晝数据 〃元素在表中位a.井返回stJOHS:否则,以P措示擂入位fi,并返回misuocESs, C用以计沖突次数,其初值供建表插入时参考 P ■ tb$h(K)i #求猖哙希地址 却?(乩曲》[p]?key!? MttLKBV //该竝》中填有记录 TBOa 〃并且关键字不相尊 collision] 口 collision] 口4 + + C); If BQ(K, H.eImiLpLlc?y rwbun SUOt^S; ?iM ntun UKSUCCESSi “査找成功,P返回待査数据元素位覽 // 査找不成功(H. Ze[p]上my == WJLUtEy), 〃 p返阿的入位* 二、哈希表C语言实现 #i nclude stdio.h #in elude stdlib.h #defi ne SUCCESS 1 #defi ne UNSUCCESS 0 #define DUPLICATE -1 #define OK 1 #define ERROR -1 #define EQ(a,b) ((a)==(b)) #define LT(a,b) ((a) (b)) #define LQ(a,b) ((a)=(b)) #define BT(a,b) ((a) (b)) #define NULLKEY-111 哈希表容量递增表,int hashsize[]={11,19,29,37}:// 哈希表容量递增表, // 一个合适的