碰撞处理中的开放式寻址是什么意思?

时间:2016-03-16 13:58:59

标签: data-structures

在散列中发生碰撞,有不同类型的碰撞避免。 1)链接 2)开放寻址等, 开放寻址的含义以及如何在开放寻址中存储索引。计算??

1 个答案:

答案 0 :(得分:2)

Collision是一种情况,当数据集U中的两个或多个数据元素的结果哈希值映射到哈希表中的same位置时,称为哈希冲突。在这种情况下,两个或多个数据元素有资格存储/映射到哈希表中的相同location

Open addressing也称为closed hashing是一种通过probing解决冲突的方法,或者搜索数组中的其他位置,直到找到目标记录,或者未使用的数组插槽为found,表示表中没有这样的键。

在开放寻址中,插入时,如果发生冲突,则尝试备用单元,直到找到empty桶。采用以下哪种技术。 探测的方法有很多种:LinearQuadraticCuckoo hashing(我在项目中使用过),double hashing

现在深入了解probing你的意思。假设我们想在哈希表中进行插入和搜索操作。

插入

当发生碰撞时,我们只是探测或转到表格中的下一个插槽。 如果是unoccupied - 我们store那里的密钥。 如果是occupied - 我们continue探测下一个广告位。

搜索

如果键哈希到占用的位置并且没有匹配, 我们探讨下一个位置。

a)match - successful搜索

b)empty位置 - unsuccessful搜索

c)occupiedno匹配 - continue探测。

当到达表的末尾时,探测从beginning继续, 直到达到原始起始位置。

要在此添加更多内容,在open addressing中我们需要额外的数据结构来保存数据,因为closed addressing数据存储到链接列表中头指针通过指针引用,该指针的索引存储在我们的哈希表中。

使用每个键的哈希函数计算索引。让我们说在线性探测中我们需要在哈希表中插入[20]。

Hashtablesize=20;

void insert(string s)
{
    // Compute the index using the Hash Function
    int index = hashFunc(s);
    // Search for an unused slot and if the index will exceed the hashTableSize
    // we will roll back
    while(hashTable[index] != "")
        index = (index + 1) % hashTableSize;
    hashTable[index] = s;
}

二次探测也类似于线性探测,差异在于探测序列的迭代。在二次探测中,探测序列可以是

index = index % hashTableSize
index = (index + 1^2) % hashTableSize
index = (index + 2^2) % hashTableSize
index = (index + 3^2) % hashTableSize