📜  DAA开放寻址技术

📅  最后修改于: 2020-12-10 06:23:59             🧑  作者: Mango

开放式寻址技术

通常使用三种技术来计算开放寻址所需的探针序列:

  • 线性探测。
  • 二次探测。
  • 双重哈希。

1.线性探测:

它是计算机编程中用于解决哈希表冲突的方案。

假设将具有密钥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。

解决方案:哈希表的初始状态


2.二次探测:

假设具有键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。

解决方案:对于二次探测,我们有

这是哈希表的初始状态

因此,在插入所有键之后,哈希表为

3.双重散列:

双重散列是可用于开放式寻址的最佳技术之一,因为产生的排列具有随机选择的排列的许多特征。

双重哈希使用以下形式的哈希函数

其中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。

解决方案:哈希表的初始状态为