在散列中发生碰撞,有不同类型的碰撞避免。 1)链接 2)开放寻址等, 开放寻址的含义以及如何在开放寻址中存储索引。计算??
答案 0 :(得分:2)
Collision
是一种情况,当数据集U中的两个或多个数据元素的结果哈希值映射到哈希表中的same
位置时,称为哈希冲突。在这种情况下,两个或多个数据元素有资格存储/映射到哈希表中的相同location
。
Open addressing
也称为closed hashing
是一种通过probing
解决冲突的方法,或者搜索数组中的其他位置,直到找到目标记录,或者未使用的数组插槽为found,表示表中没有这样的键。
在开放寻址中,插入时,如果发生冲突,则尝试备用单元,直到找到empty
桶。采用以下哪种技术。
探测的方法有很多种:Linear
,Quadratic
,Cuckoo hashing
(我在项目中使用过),double hashing
。
现在深入了解probing
你的意思。假设我们想在哈希表中进行插入和搜索操作。
插入:
当发生碰撞时,我们只是探测或转到表格中的下一个插槽。
如果是unoccupied
- 我们store
那里的密钥。
如果是occupied
- 我们continue
探测下一个广告位。
搜索:
如果键哈希到占用的位置并且没有匹配, 我们探讨下一个位置。
a)match
- successful
搜索
b)empty
位置 - unsuccessful
搜索
c)occupied
和no
匹配 - 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