Double Hashing - 删除和重新散列函数

时间:2014-11-30 16:55:20

标签: c++ hash hashmap double-hashing

我正在处理一个hashmap,并且遇到了双散列打开地址样式映射的remove函数的问题。让我说我插入一个大小为10的表,我的2个哈希函数如下:

int hash( int key, std::size_t M ) { return key % M; }
int hash2( int key, std::size_t M ) { return key % (M-1) + 1; }

如果我插入带有键0,10和20的项目,则项目将转到位置0,2和3.

<[ 0:A, - , 10:B, 20:C, - , - , - , - , - , - ]>

但是,在删除项目时,我想删除该项目,并在同一群集中重新散列以下项目。当我删除带有键0的项目时,它会找到要删除的项目没有问题。但是,它现在需要跳转到索引2 - 但是它可以因为它使用键0作为其递增,所以它跳转到索引1。因此,它永远不会在集群中找到后续项目。我该怎么做???

1 个答案:

答案 0 :(得分:2)

通常,您可以通过在该位置放置已删除的标记来删除项目。为了搜索,它被占用,因此碰撞并需要探测找到的物品不是孤立的。但插入时,您可以重复使用该点。如果表中已删除标记的数量变大,您可以重新对表进行清理以进行清理。

本讲座更详细地解释:Open Addressing