具有墓碑的哈希表的负载因子

2023-12-26

那么问题来了,在计算哈希表的负载因子时是否应该包括墓碑。

我认为,考虑到负载系数是用来确定何时扩展容量的,所以不应该包括墓碑。一个明显的例子是,如果您几乎填充然后删除哈希表中的每个值。这里的插入非常容易(没有碰撞),所以我相信负载因子不应该包括它们。

但您可能会看到这一点并认为所有墓碑查找都会很慢(可能会搜索几乎整个空间)。

所以我想我会问这个问题。哈希表的负载因子是否应该在计算中包括墓碑?


负载因子不是哈希表数据结构的重要组成部分——它是定义的方式动态系统的行为规则(增长/收缩哈希表是一个动态系统)。

此外,在我看来,在 95% 的现代哈希表情况下,这种方式过于简化,动态系统的表现并不理想。它的优点:

  • 嗯,理解和实施都很简单。
  • 哈希表数据结构不应该存储许多具有某些阈值的数字——可能只存储一个数字。当哈希表非常小时并且标头的大小影响总数据结构内存效率(以存储条目的字节为单位)时,这是有意义的。
  • 在某些(和常见)情况下:仅附加/更新哈希表,更复杂的行为模型退化为“仅负载因子”模型,换句话说,负载因子模型定义相对最优的行为。

另请参阅我对负载因子模型的回答。我更喜欢[最小负载、目标负载、最大负载]+增长因子框架模型。 https://stackoverflow.com/a/23438573/648955


If you develop general-purpose hash table with tombstones, I think you can just pick up my results (below). I spend maybe several weeks solely developing this model. Maybe you can make some improvements or further research, I would be glad.

针对两种主要的哈希表动态行为模式:

  • growing hash table (maybe in growing phase), with little or no removals
    • 当未指定(或未知)适当的容量时,哈希表的初始填充
  • hash table that remains of the same or nearly the same size, number of removals is equal or nearly equal to number of insertions
    • 具有上限大小的缓存、LRU、具有条目过期的表

定义了两个阈值:

  • max size(即存活条目的数量),table size * max load

  • 空闲(即空的,没有活动条目或墓碑)插槽的最小数量, 通过魔法公式计算 https://github.com/OpenHFT/Koloboke/blob/0b4898817f41b0820e0d9a2839fb593f112f9edc/lib/impl/src/main/javaTemplates/net/openhft/koloboke/collect/impl/hash/MutableDHash.java#L35.

如果哈希表大小超过max size,我们假设我们处于“增长模式”,重新哈希表大小以能够存储current size * growth factor恩茨岛e.选择最接近的桌子尺寸current size * growth factor / target load.

如果空闲槽数低于空闲槽位的最小数量,我们处于“缓存模式”,重新哈希“到当前大小”,i。 e.尽可能接近的桌子尺寸current size / target load.

Read 上述所有逻辑的源代码 https://github.com/OpenHFT/Koloboke/blob/0b4898817f41b0820e0d9a2839fb593f112f9edc/lib/impl/src/main/javaTemplates/net/openhft/koloboke/collect/impl/hash/MutableDHash.java.

另外,文章从哈希表中清除墓碑:理论与实践 https://github.com/OpenHFT/Koloboke/wiki/Tombstones-purge-from-hashtable:-theory-and-practice提供了一些线索。


如果您开发专门用途的哈希表,哪些动态属性是已知的(或可以研究的),我建议您开发自己的模型,适合您的情况。不要依赖纯数学和计算机科学理论,在基准测试中评估你的模型。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

具有墓碑的哈希表的负载因子 的相关文章

  • 将 Hashtable 转换为 xml 字符串,然后再转换回 HashTable,无需使用 .NET Serializer

    有谁知道如何将 Hashtable 转换为 XML String 然后再转换回 HashTable 而不使用基于 NET 的 XMLSerializer 当代码在 IE 内部运行并且浏览器的保护模式打开时 XMLSerializer 会带来
  • 我什么时候应该对整个哈希表进行重新哈希?

    我如何决定何时应该对整个哈希表进行重新哈希 这在很大程度上取决于您解决冲突的方式 如果您使用线性探测 负载系数远高于 60 左右时 性能通常会开始严重下降 如果您使用双散列 80 85 的负载因子通常是相当合理的 如果使用碰撞链 负载系数高
  • Java 中的散列键

    在java中 当我使用字符串作为Hashmap的键时 我得到的结果与使用字符串哈希码作为HashMap中的键时的结果略有不同 有什么见解吗 当我使用字符串哈希码作为 HashMap 中的键时 You mustn t使用哈希码本身作为密钥 哈
  • 为什么HashMap要求初始容量是2的幂呢?

    当我浏览Java的HashMap源代码时 我看到了以下内容 The default initial capacity MUST be a power of two static final int DEFAULT INITIAL CAPAC
  • 我可以将名为“keys”的键添加到哈希表而不覆盖“keys”成员吗

    看来我无法将任意键名添加到hashtable如果具有该名称的成员已经存在 则不会覆盖该成员 我创建一个哈希表 x 并添加两个键 one and two x x one 1 x two 2 然后通过评估显示添加的键 x Keys x Keys
  • 哈希表如何绑定到下拉列表?

    在 vb net winforms 中 哈希表如何绑定到下拉列表或任何其他数据源驱动的控件 只需使用下拉列表的 Datasource 属性 DropDownList dd new DropDownList Hashtable mycount
  • C 的最小哈希函数?

    我不能使用 boost hash 因为我必须坚持使用 C 而不能使用 C 但是 我需要对大量 10K 到 100k 令牌字符串 5 到 40 字节长度 进行哈希处理 以便在这些字符串中进行搜索速度最快 MD5 SHA1 或任何长哈希函数对于
  • SML/NJ:如何使用哈希表?

    我真的很想在 SML 中创建一个哈希表 似乎 SML NJ 中已经有一个结构 问题是 我该如何使用它 我还没有完全理解如何在SML中使用结构 并且我读过的书中的一些非常基本的示例给了我错误 我什至不知道如何纠正 所以使用HashTable结
  • 迭代 hastable 键的枚举会引发 NoSuchElementException 错误

    我正在尝试使用枚举来迭代哈希表中的键列表 但是我在列表中的最后一个键处不断收到 NoSuchElementException Hashtable
  • 在 OCaml 中将哈希表转换为对(键,值)列表

    OCaml 中有没有办法将哈希表转换为 键 对 值列表 我知道 给定一个哈希表ht我们可以做的 BatList of enum BatHashtbl enum ht 使用电池库 这会将表转换为枚举 然后将枚举转换为列表 但我正在寻找一种不使
  • 为哈希选择合适的表大小

    如果我有一个 1000 个键集 我的哈希表的合适大小是多少 如何确定 它取决于负载系数 表将增加其大小并重新分布其元素的 满百分比 点 如果您知道正好有 1000 个条目 并且该数字永远不会改变 则只需将负载因子设置为 1 0 将初始大小设
  • Ruby 维护哈希插入顺序

    我正在寻找一种方法来维护我在 Ruby 中使用的哈希的插入顺序 我的数据来自数据库 并且已经按照我想要的方式分组 排序 但 Ruby 不保证在我的版本中保持哈希中的顺序1 8 4 有什么解决方法吗 如果没有 我可以创建自定义比较器吗 这是哈
  • C 中的布谷鸟哈希

    有没有人有实施布谷鸟哈希 http en wikipedia org wiki Cuckoo hashing在C语言中 如果有一个开源的非 GPL 版本那就完美了 既然 Adam 在评论中提到了它 有人知道为什么它没有被太多使用吗 这只是一
  • 碰撞解决:二次探测与单独链接

    好的 我一直在对哈希表和不同的冲突解决问题进行一些实验 我试图找出哪个更有效地进行查找 即使用单独的链接或二次探测来解决冲突的哈希表 我的结果表明 即使对于较小的负载因子 例如 0 4 或 0 2 单独链接也比二次探测更快 是这种情况还是我
  • Java 哈希表与对象引用的问题

    我有一个哈希表 例如 HashTable ht 1 1 2 1 3 1 现在 我像 Integer foo Integer 1 一样实现它 并像这样声明哈希表 HashTable ht foo foo 2 foo 3 foo 现在 据我了解
  • 构建哈希表/哈希函数

    我想构建一个哈希表 用于查找 1 到 15 个字节的字节序列 字符串 中的键 我想存储一个整数值 所以我想一个用于散列的数组就足够了 我很难概念化如何构造一个哈希函数 以便给定的键将给出数组的索引 任何帮助将不胜感激 哈希中的最大条目数为
  • 传递给 Invoke-Command 的属性将类型从 IDictionary 更改为 HashTable

    我运行时遇到错误Invoke Command其中脚本块采用字典类型的参数 无法处理参数 字典 的参数转换 无法转换类型的 System Collections Hashtable 值 输入 System Collections Hashta
  • 获取单词中重复次数最多的字母的数量

    我正在尝试计算单词中重复次数最多的字母的数量 function GreatestCount str var count for var i 0 i
  • 初始化 HashMap 的最佳方法

    我通常会这样做 HashMap
  • 什么时候使用哈希表?

    什么情况下使用哈希表可以提高性能 什么情况下不能 哪些情况不适合使用哈希表 什么情况下使用哈希表可以提高性能 什么情况下不能 如果您有理由关心 请使用哈希表和您正在考虑的其他任何内容来实现 将您的实际数据放入其中 并衡量哪个性能更好 也就是

随机推荐