双重哈希 - 删除和重新哈希函数
Double Hashing - remove and rehash function
我正在处理哈希图,并且在使用双哈希开放地址样式映射的删除功能时遇到问题。假设我在大小为 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。因此,它将永远不会在群集中找到后续项目。我该怎么做???
通常,
您可以通过在该位置放置已删除的标记来删除项目。出于搜索目的,它被占用,因此发生碰撞并需要探测才能找到的项目不会孤立。但是在插入时,您可以重复使用该位置。如果表中已删除的标记数量变得很大,您可以重新对表进行哈希处理以对其进行清理。
本讲座更详细地解释:开放寻址
相关文章:
- 如何为位集找到/实现一个好的哈希函数
- 对于短字符串来说,这是一个很好的哈希函数吗?
- 我在C++中使用提升哈希函数将 3 个双精度组合成一个面临冲突的哈希
- 无冲突的哈希函数
- Qt5 哈希函数在 Windows 7 和 Windows10 上不会返回相同的哈希
- 解决由于在哈希函数中使用了不完整的类型而导致的编译失败
- 使用 Murmur2 64 位哈希函数生成会导致冲突的输入
- 错误:哈希函数必须可使用键类型的参数进行调用
- unordered_set是否适合存储矢量<int>元素的数据结构?如果是这样,我将如何实现哈希函数?
- 为什么C++哈希函数的返回类型是 std::size_t,而不是独立于平台的类型?
- 哈希函数计算
- 哈希函数中同一键的不同值和良好的哈希值排序
- 将 C# 哈希函数转换为C++
- 如何创建用于生成噪声的哈希函数
- 插入不从哈希函数中检索键
- 简单的 C++11 哈希函数无法编译
- 对于这个英语单词列表来说,什么是好的哈希函数?
- std::bitset 哈希函数算法
- 如何生成伪随机 32 字节字符串以用作加密哈希函数中的盐?
- C unordered_map自定义的哈希函数碰撞