📅  最后修改于: 2020-12-10 06:23:59             🧑  作者: Mango
通常使用三种技术来计算开放寻址所需的探针序列:
它是计算机编程中用于解决哈希表冲突的方案。
假设将具有密钥k的新记录R添加到存储表T,但是具有哈希地址H(k)的存储位置。 H已被填充。
解决冲突的自然钥匙是将R穿越到T(h)之后的第一个可用位置。我们假设位置为m的表T是圆形的,因此T [i]在T [m]之后。
上面的冲突解决方案称为“线性探测”。
线性探测很容易实现,但存在称为主聚类的问题。长期占用的插槽会堆积起来,从而增加了平均搜索时间。之所以会出现簇,是因为接下来以i个完整时隙开头的空时隙以概率(i +1)/ m填充。长期占用的时隙往往会变长,并且平均搜索时间会增加。
给定一个普通的哈希函数h':U {0,1 … m-1},线性探测方法使用哈希函数。
h (k, i) = (h' (k) + i) mod m
其中'm'是哈希表的大小,而h'(k)= k mod m。对于i = 0,1 …. m-1。
给定密钥k,第一个时隙为T [h'(k)]。我们接下来是时隙T [h'(k)+1],依此类推,直到时隙T [m-1]。然后,我们回绕到时隙T [0],T [1]…。直到最后时隙T [h'(k)-1]。由于初始探针位置处理了整个探针序列,因此仅m个不同的探针序列可用于线性探针。
示例:考虑使用线性探测将键24、36、58、65、62、86插入大小为m = 11的哈希表中,请考虑主要哈希函数为h'(k)= k mod m。
解决方案:哈希表的初始状态
假设具有键k的记录R的哈希地址为H(k)= h,然后代替搜索地址为h,h + 1和h + 2的位置…我们线性搜索具有地址的位置
二次探测使用以下形式的哈希函数
其中(与线性探测一样)h'是辅助哈希函数c 1 ,c 2 ≠0是辅助常数,i = 0,1 … m-1。初始位置为T [h'(k)];之后探测的位置偏移量,该数量以二次方式取决于探测号i。
示例:考虑使用c 1 = 1和c 2 = 3的二次探测将键74、28、36、58、21、64插入大小为m = 11的哈希表中。进一步考虑主要哈希函数为h'(k)= k mod m。
解决方案:对于二次探测,我们有
这是哈希表的初始状态
因此,在插入所有键之后,哈希表为
双重散列是可用于开放式寻址的最佳技术之一,因为产生的排列具有随机选择的排列的许多特征。
双重哈希使用以下形式的哈希函数
其中h 1和h 2是辅助哈希函数,m是哈希表的大小。
h 1 (k)= k mod m'或h 2 (k)= k mod m'。这里的m'略小于m(例如m-1或m-2)。
示例:考虑使用双哈希将键76、26、37、59、21、65插入大小为m = 11的哈希表中。考虑辅助哈希函数为h 1 (k)= k mod 11和h 2 (k)= k mod 9。
解决方案:哈希表的初始状态为