从哈希表中删除一个值的成本是多少?

2024-04-29

现在我有一个问题,当我们在插入过程中使用线性探测时,有人问我从哈希表中删除值的成本。

通过阅读互联网上的各种内容,我发现它必须与负载因子有关。虽然我不确定,但我读到了负载因数与所需探头数量之间的关系,探头数量 = 1 / (1-LF)。

所以我相信成本必须取决于探针序列。但另一个想法毁了一切。

如果该元素已插入 p 探针中,而现在我试图删除该元素,该怎么办?但在此之前,我已经删除了一些具有相同哈希码的元素,并且是插入小于 p 的探针的一部分。

在这种情况下,我到达了一个阶段,在哈希表中看到一个空槽,但我不确定我尝试删除的元素是否已被删除,或者由于探测而位于其他位置。

我还发现,一旦删除一个元素,我必须用一些特殊的指示符来标记这个插槽,以通知它可用,但这并不能解决我不确定我愿意删除的元素的问题。

有人可以建议在这种情况下如何找到费用吗? 如果是非线性探测,方法会有所不同吗?


标准方法是“查找元素,标记为已删除”。标记显然具有 O(1) 成本,因此总操作成本与查找相同:O(1)expected。它可以高达 O(n)在退化情况下(例如,所有元素都具有相同的哈希值)。理论上我们只能说 O(1) 预期。

关于负载率。负载系数(占用桶数与总数的比值)越高,则越大expected因子(但这不会改变理论 O 成本)。请注意,在这种情况下,负载因子包括表元素中存在的数量加上之前标记为已删除的存储桶的数量。

其他探测类型(例如二次)不会改变理论成本,但可能会改变预期的常数因子或其方差。如果你看一下“后备”序列,在线性排序中,不同桶的序列会重叠。这意味着如果对于某个桶来说序列很长,那么对于相邻的桶来说它也会很长。例如:如果桶 4 到 10 被占用,则桶 #4 的序列是 7 个桶长(4, 5, 6, ..., 10),对于 #5 来说是 6,依此类推。对于二次探测,情况并非如此。

然而,线性探测具有更好的内存缓存行为的优点,因为您检查彼此靠近的内存单元。但在实践中,对于二次探测后备序列来说,很少有足够长的时间来解决这一问题。

最后,在线性探测的情况下,可以工作without已删除标记,但为此,您必须使删除过程变得相当复杂(尽管预计仍为 O(1),但常数因子要高得多)。是否值得,得通过实际分析来决定;例如,这稍微简化了插入和查找。不过,对于 C++ 实现来说,这会有一个缺点,即擦除() 会使迭代器无效。

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

从哈希表中删除一个值的成本是多少? 的相关文章

  • C++ 中的哈希表?

    每当我需要存储与特定类型的值 键值 例如字符串或其他对象 关联的一些数据时 我通常使用 C stdlib 映射 stdlib 映射实现基于树 它比标准数组或 stdlib 向量提供更好的性能 O log n 我的问题是 您是否知道任何可以提
  • 字符串的哈希函数

    我们目前正在课堂上处理哈希函数 我们的老师要求我们使用互联网上的哈希函数来与我们在代码中使用的两个函数进行比较 第一个 int HashTable hash string word POST the index of entry is re
  • 构建哈希图的哈希图

    我不经常问问题 大多数时候问题可以通过一些研究来解决 对吧 但我只是想听听你的意见 因为可能有更好的 更有效的方法来做到这一点 让我们看看 下面的代码工作得很好并且达到了它的目的 代码的结果是哈希图的哈希图 我需要它作为另一项工作的查找表
  • 如何在 C++ 中实现通用哈希函数

    我正在尝试通过模板在 C 中实现 HashTable 这是签名 template
  • Hashtable的表属性为什么要序列化?

    为什么是table现场Hashtable已序列化 尽管它被标记为transient 它被标记为瞬态 因为在 Entry 数组上使用默认序列化方案是不安全的 相反 当哈希表被反序列化时 表中的键必须重新哈希 并且必须根据新的哈希码值将条目添加
  • GLib哈希表循环问题

    我要使用GLib http en wikipedia org wiki GLib的哈希表在 C 程序中的实现 仅此而已 我只是在尝试 我写了下面一段代码进行测试 include
  • 为什么HashMap要求初始容量是2的幂呢?

    当我浏览Java的HashMap源代码时 我看到了以下内容 The default initial capacity MUST be a power of two static final int DEFAULT INITIAL CAPAC
  • HashMap 的迭代器是快速失败而 HashTable 的枚举器不是,这到底是什么意思?

    我正在查找这两个类之间的区别 这一点出现在很多答案中 此博客是来源 http javarevisited blogspot com 2010 10 difference Between hashmap and html http javar
  • 如何获取Lua哈希表中键的数量?

    myTable myTable foo 12 myTable bar blah print myTable this prints 0 我实际上是否必须迭代表中的项目才能获取键的数量 numItems 0 for k v in pairs
  • 如何判断TBucketList的桶数

    我一直在使用 TBucketList 和 TObjectBucketList 来满足我的所有哈希需求 但从未尝试过切换存储桶的数量 我隐约记得这在数据结构类中意味着什么 但是有人可以详细说明 Delphi 中这个特定类的细微差别吗 The
  • 如何在perl中不使用key来查找值是否存在于hash中?

    我有一个像这样的哈希图 my name AUS dynamic values my hash a gt x gt 1 gt US 2 gt UK y gt 1 gt AFRICA 2 gt AUS b gt
  • Ruby 维护哈希插入顺序

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

    哈希表新手 有一个简单的问题 由于某种原因 谷歌搜索没有给我一个直接的答案 假设我有一个
  • 有条件地将键值对包含在哈希中[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 有人可以帮我缩短以下方法吗 我从这个开始 我很喜欢 def self some hash foo gt bar end 现在我想添加一个可选键 我能想
  • ANSI C 哈希表实现,数据位于一个内存块中

    我正在寻找一种哈希表的开源 C 实现 它将所有数据保存在一个内存块中 因此可以轻松地通过网络发送数据 我只能找到为添加到其中的每个键值对分配小块内存的内存 预先非常感谢您的所有投入 编辑 它不一定需要是哈希表 无论键值对表可能会做什么 序列
  • 如何在 C# 中使用 foreach 枚举哈希表

    我试图列举一个Hashtable其定义为 private Hashtable keyPairs new Hashtable foreach SectionPair s in keyPairs if s Section incomingSec
  • Java 中的 ConcurrentHashMap 和 Hashtable [重复]

    这个问题在这里已经有答案了 Java 中的 ConcurrentHashMap 和 Hashtable 有什么区别 哪个对于线程应用程序更有效 ConcurrentHashMap 和 Hashtable 锁定机制 Hashtable属于Co
  • 获取单词中重复次数最多的字母的数量

    我正在尝试计算单词中重复次数最多的字母的数量 function GreatestCount str var count for var i 0 i
  • 什么时候使用哈希表?

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

    具有 32 位键和指向单独存储的值的 32 位指针的哈希表的大小是多少 是 2 32 个槽 4 字节 键 4 字节 指向值的指针 4 10 9 4 4 32GB 我想了解哈希表的空间复杂度 我认为你问错了问题 数据结构的空间复杂度表示它占用

随机推荐