双重哈希 - 删除和重新哈希函数

Double Hashing - remove and rehash function

本文关键字:新哈希 函数 哈希 删除      更新时间:2023-10-16

我正在处理哈希图,并且在使用双哈希开放地址样式映射的删除功能时遇到问题。假设我在大小为 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。因此,它将永远不会在群集中找到后续项目。我该怎么做???

通常,

您可以通过在该位置放置已删除的标记来删除项目。出于搜索目的,它被占用,因此发生碰撞并需要探测才能找到的项目不会孤立。但是在插入时,您可以重复使用该位置。如果表中已删除的标记数量变得很大,您可以重新对表进行哈希处理以对其进行清理。

本讲座更详细地解释:开放寻址