链式哈希表与开放寻址哈希表

2024-01-01

有人可以解释这两种实现之间的主要区别(优点/缺点)吗?

对于图书馆,建议采用什么实施方式?


维基百科关于哈希表的文章 http://en.wikipedia.org/wiki/Hash_table对人们使用的不同哈希表方案提供了明显更好的解释和概述,这比我能想到的要好得多。事实上,您最好阅读那篇文章,而不是在这里提出问题。 :)

那是说...

链式哈希表索引到指向链表头的指针数组。每个链表单元格都有为其分配的键以及为该键插入的值。当您想要从其键查找特定元素时,键的散列用于计算出要遵循的链表,然后遍历该特定列表以查找您要查找的元素。如果哈希表中的多个键具有相同的哈希值,那么您将拥有包含多个元素的链表。

链式哈希的缺点是必须遵循指针才能搜索链表。好处是,链式哈希表只会随着负载因子(哈希表中元素与存储桶数组长度的比率)的增加而线性变慢,即使它上升到 1 以上。

开放寻址哈希表索引到指向(键,值)对的指针数组。您可以使用键的哈希值来确定首先查看数组中的哪个槽。如果哈希表中的多个键具有相同的哈希值,则您可以使用某种方案来决定要查找的另一个槽。例如,线性探测是指您查看所选插槽之后的下一个插槽,然后查看该插槽之后的下一个插槽,依此类推,直到您找到与您要查找的键匹配的插槽,或者您击中了一个空的插槽。槽(在这种情况下,钥匙不能在那里)。

当负载因子较低时,开放寻址通常比链式哈希更快,因为您不必遵循列表节点之间的指针。如果负载因子接近 1,它会变得非常非常慢,因为在找到您要查找的键或空槽之前,您通常必须搜索存储桶数组中的许多槽。此外,哈希表中的元素永远不能多于存储桶数组中的条目。

为了应对这样一个事实:当负载因子接近 1 时,所有哈希表至少会变得更慢(在某些情况下实际上完全崩溃),实际的哈希表实现使存储桶数组变得更大(通过分配新的存储桶数组,并从其中复制元素)当负载因子超过某一值(通常约为 0.7)时,将旧的装入新的,然后释放旧的。

上述所有内容都有很多变化。再次请看维基百科的文章,确实相当不错。

对于一个供其他人使用的图书馆,我会strongly建议尝试一下。由于它们通常对性能至关重要,因此您通常最好使用其他人已经经过仔细调整的哈希表实现。有许多开源 BSD、LGPL 和 GPL 许可的哈希表实现。

例如,如果您正在使用 GTK,那么您会发现有一个很好的GLib 中的哈希表 https://people.gnome.org/~ryanl/glib-docs/glib-Hash-Tables.html.

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

链式哈希表与开放寻址哈希表 的相关文章

  • 基本树概念:定义祖先

    祖先的定义是什么 更具体地说 E 会是 H 的祖先吗 或者更简单地说 F C A 是 H 的祖先 也许甚至是G 我只是想澄清这个简单的概念 E 不是 H 的祖先 它是uncle因为它是一个siblingF 的parent of H F C
  • 在旋转排序数组中搜索数字

    给定一个可以旋转的排序数组 以最小的时间复杂度在其中找到一个元素 例如 数组内容可以是 8 1 2 3 4 5 假设您在其中搜索 8 该解决方案仍然适用于二分搜索 因为您需要将数组划分为要检查的两个部分 在排序数组中 您只需查看每个部分并确
  • 如何更新 Prim 算法堆中的元素优先级?

    我正在研究Prim算法 代码中有一部分穿过切割的下一个顶点将进入属于MST 在这样做的同时 我们还必须 更新另一组中与离开顶点相邻的所有顶点 这是来自的快照CLRS 有趣的部分在于第 1 行 11 但由于我们在这里使用堆 因此我们只能访问最
  • C++ std::pair 的 C# 模拟是什么?

    我感兴趣的是 C 的类似物是什么std pair在 C 中 我发现System Web UI Pair类 但我更喜欢基于模板的东西 谢谢你 Tuples 自 NET4 0起可用 http msdn microsoft com en us l
  • 寻找成熟的 M-Tree 实现 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个成熟的 java M Tree 实现 甚至任何 M Tree 实现 除了我找到的唯一实现 http en wikipedia
  • 是否可以反转包含循环的链表?

    我正在看一些面试问题 其中一个要求反转包含循环的链表 所以假设我有一个如下所示的链接列表 F lt E V A gt B gt C gt D 然后反转列表将创建以下内容 F gt E V A lt B lt C lt D 这里的问题是 C
  • 传递给 Invoke-Command 的属性将类型从 IDictionary 更改为 HashTable

    我运行时遇到错误Invoke Command其中脚本块采用字典类型的参数 无法处理参数 字典 的参数转换 无法转换类型的 System Collections Hashtable 值 输入 System Collections Hashta
  • C/C++ 中的双向链表与多链表 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 双链表和多链表有什么区别 在 C C 程序的帮助下会更好地解释我 定义 A 多链表是一个链表 其中每个节点可以包含指向链表的多个节点的
  • 什么是二叉搜索树中的“内部节点”?

    我正在互联网上搜索 内部节点 一词的定义 我找不到简洁的定义 我正在查看的每个来源都使用该术语但没有定义它 并且这种用法并不能产生内部节点实际是什么的正确定义 这是我主要看的两个地方 Link https planetmath org Ex
  • 是否有一种 Java 数据结构实际上是具有双索引和内置插值的 ArrayList?

    我正在寻找具有以下特征的预构建 Java 数据结构 它应该看起来像 ArrayList 但应该允许通过双精度而不是整数进行索引 请注意 这意味着您可能会看到与原始数据点不相符的索引 即询问与键 1 5 对应的值 EDIT 为了清楚起见 根据
  • Delphi是否存在无锁队列“多个生产者-单个消费者”?

    我发现了几个针对单个生产者 单个消费者的实现 但没有找到多个生产者 单个消费者的实现 Delphi是否存在 多个生产者 单个消费者 的无锁队列 无锁队列全线程库 http otl 17slon com支持多个生产者 您可以将它与线程库分开使
  • 对于范围从 0 到最大值的 uint64_t 键,最佳哈希函数是什么?

    假设我们有一组元素并希望将它们存储在哈希映射中 例如std unordered set 并且每个元素都有一个 type 的键uint64 t其值可以从 0 到最大可能值变化 使用简单哈希函数 其中键的哈希值就是键本身 是最佳选择吗 它是否取
  • 为什么在用 size 声明的向量上使用 Push_back 会导致向量为零?

    我制作了一个恒定大小的向量来存储负值 然后打印我得到的所有值都是零 我只是想知道为什么它不存储负值 include
  • 如何定义基于标签的组织结构?

    原标题 有没有办法在基于标签的组织方法上强制建立关系结构 我有一些实体 它们有一系列属性 一些属性影响实体可以具有的其他属性 许多属性被组织成组 并且有时实体被要求具有来自某些组的一定数量的属性 或者可能具有来自某些组的一定范围的属性 有没
  • ConcurrentLinkedDeque 与 LinkedBlockingDeque

    我需要一个线程安全的 LIFO 结构 并发现我可以使用线程安全的实现Deque为了这 Java 7 引入了ConcurrentLinkedDeque http docs oracle com javase 7 docs api java u
  • 相当于一个允许重复键的排序字典

    我需要一个数据结构 可以通过与对象关联的浮动键对对象进行排序 从低到低的在前 问题是键代表成本 所以经常有重复 我不关心这一点 因为如果两个具有相同的成本 我只会抓住第一个 因为它没有区别 问题是编译器抱怨 是否有一种数据结构的行为方式相同
  • 如何在 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
  • 同步不经常更新的哈希图的最佳方式

    我有一个在应用程序中使用的 HashMap 数据是在应用程序初始加载期间从数据库填充的 然后它始终只是读取并且从不更新 会有多个线程不断地读取数据 由于数据永远不会更新 因此我们目前不使用任何同步 仅使用 HashMap 我们现在定义的方式
  • 如何在 dijkstra 算法中以 O(log n ) 时间更新优先级队列中的键?

    过去一周我一直在研究 dijkstra 算法 我在 java 中有正确的运行代码 它使用数组来计算标准 findMin 函数 该函数为您提供距离最小的顶点 显然它是 O n 现在我希望使用优先级队列 最小堆 来实现它 我的思考过程是 whi

随机推荐