哈希表的概念
哈希(散列)(Hashing)是计算机科学中一种对资料的处理方法,通过某种特定的函数/算法(称为散列函数/算法)将要检索的项与用来检索的索引(称为散列,或者散列值)关联起来,生成一种便于搜索的数据结构(称为散列表)。二次再散列法是指第一次散列产生哈希地址冲突,为了解决冲突,采用另外的散列函数或者对冲突结果进行处理的方法。
冲突
两个不同的关键字,由于散列函数值相同,因而被映射到同一表位置上。该现象称为冲突(Collision)或碰撞。发生冲突的两个关键字称为该散列函数的同义词(Synonym)。
哈希表中解决冲突的方法有三种分别是线性探测法、二次探测法以及伪随机探测法。
这次我来详细讲解一下二次探测法,这种方法比较复杂,我会认真介绍的。
二次探测法
二次探测是防止聚集产生的一种尝试,思想是探测相隔较远的单元,而不是和原始位置相邻的单元。在线性探测中,如果哈希函数得到的原始下标是x,线性探测就是x+1,x+2,x+3......,以此类推,而在二次探测中,探测过程是x+1,x-1,x+4,x-4,x+9,x-9,x+16,x-16,x+25,x-25......,以此类推,到原始距离的步数平方。
总结就是将下标x加上1^2,-1^2,2^2,-2^2,3^2,-3^2..........k^2,-k^2以次类推
二次探测的用法
二次探测消除了线性探测的聚集问题,这种聚集问题叫做原始聚集,然而,二次探测也产生了新的聚集问题,之所以会产生新的聚集问题,是因为所有映射到同一位置的关键字在寻找空位时,探测的位置都是一样的。
实例
例如将9,5,6通过哈希函数H(key)=key%m放到哈希表中,这时发现9和6通过哈希函数得到的索引值都是0,导致冲突。
遇到这种问题时可以这样做:
x=1^2,-1^2,2^2,-2^2,3^2,-3^2..........k^2,-k^2(k<m)
可以通过(6+x)%m得到索引值,如果再次冲突将x逐渐后移直至得到对索引值不冲突。