哈希游戏哈希表(hash)的查找doc
哈希游戏作为一种新兴的区块链应用,它巧妙地结合了加密技术与娱乐,为玩家提供了全新的体验。万达哈希平台凭借其独特的彩票玩法和创新的哈希算法,公平公正-方便快捷!万达哈希,哈希游戏平台,哈希娱乐,哈希游戏
哈希表(Hash)的查找一、哈希表相关概念1、哈希函数的基本概念哈希表又称散列表。哈希表存储的基本思想是:以数据表中的每个记录的关键字k为自变量,通过一种函数H(k)计算出函数值。把这个值解释为一块连续存储空间(即数组空间)的单元地址(即下标),将该记录存储到这个单元中。在此称该函数H为哈希函数或散列函数。按这种方法建立的表称为哈希表或散列表。理想情况下,哈希函数在关键字和地址之间建立了一个一一对应关系,从而使得查找只需一次计算即可完成。由于关键字值的某种随机性,使得这种一一对应关系难以发现或构造。因而可能会出现不同的关键字对应一个存储地址。即k1≠k2,但H(k1)=H(k2),这种现象称为冲突。把这种具有不同关键字值而具有相同哈希地址的对象称“同义词”。在大多数情况下,冲突是不能完全避免的。这是因为所有可能的关键字的集合可能比较大,而对应的地址数则可能比较少。对于哈希技术,主要研究两个问题:(1)如何设计哈希函数以使冲突尽可能少地发生。(2)发生冲突后如何解决。2、哈希函数的构造方法常见的构造方法有很多种,如直接定址法,数字分析法,平方取中法等。接下来,我们介绍其中的几种:(1)除留余数法取关键字k被某个不大于表长m的数p除后所得余数作为哈希函数地址的方法。即:H(k)=kmodp这种方法的关键是选择好p。使得数据集合中的每一个关键字通过该函数转化后映射到哈希表的任意地址上的概率相等。理论研究表明,一般取p为小于m的最大质数或不包含小于20的质因素的合数。(2)平方取中法先将关键字平方,然后取其中间几位作为散列地址。所取位数由地址空间范围决定。若地址空间小于所取位数值决定的范围,可通过乘以一比例因子来解决。(3)折叠法把关键字分割成位数相等(最后一部分的位数可以不同)的几部分,然后通过折叠后将几部分进行相加,丢掉进位位,所得值即为散列地址。散列的位数由地址空间的位数而定。分割方法:从右至左相加方法有两种:移位叠加:将分割后的各部分低位对齐相加。界间叠加:将某些部分倒置后再相加。相当于把关键字看成一张纸,从一端向另一端沿间界逐层折叠,再把相应位数相加。3、哈希函数的冲突检测方法假设哈希表的地址范围为0~m-l,当对给定的关键字k,由哈希函数H(k)算出的哈希地址为i(0≤i≤m-1)的位置上已存有记录,这种情况就是冲突现象。处理冲突就是为该关键字的记录找到另一个“空”的哈希地址。即通过一个新的哈希函数得到一个新的哈希地址。如果仍然发生冲突,则再求下一个,依次类推。直至新的哈希地址不再发生冲突为止。常用的处理冲突的方法有开放地址法、链地址法等几类。(1)开放地址法当发生冲突时,将依次探测“下一个位置”,直到找到其关键字相匹配的元素或找到一个空位插入。设哈希空间长度为m,“下一个位置”由下式确定:Hi=(H(key)+di)modmH(key):哈希函数m:哈希表长度di:求“下一个位置”的增量di的确定方法a)线。这种di的取法称为线性探测再散列。即“下一个位置”为哈希表的直接后继。若当di=m-1时仍未查到,则说明表满,还要查找另外的溢出表。缺点:容易产生“二次聚集”b)二次探测再散列di=12,-12,22,-22,…,k2(k≤m/2)c)伪随机探测再散列di由一个伪随机函数发生器产生的一个伪随机数序列来确定。(2)链地址法将所有关键字为同义词的记录存储在同一链表中。设哈希地址在区间[0..m-1]上,设置一个指针向量:Chainchainhash[m];每个分量的初始状态为空,凡哈希地址为i的的记录则插入到chainhash[i]的链表中。插入的位置可以在表头、表尾,也可在中间。为了查找的方便,可以使同一链表中记录的关键字有序。如K={19,14,23,01,68,20,84,27,55,11,10,79}H(key)=keymod13,存储链表如图中所示:二、哈希表C语言描述三、哈希表C语言实现#include#include#ESS1#ESS0#defineDUPLICATE-1#defineOK1#defineERROR-1#defineEQ(a,b)((a)==(b))#defineLT(a,b)((a)(b))#defineLQ(a,b)((a)=(b))#defineBT(a,b)((a)(b))#defineNULLKEY-111inthashsize[]={11,19,29,37};//哈希表容量递增表,//一个合适的素数序列intm=0;//哈希表表长,全局变量typedefintKeyType;typedefintinfo;typedefstr