什么是哈希表和哈希图及其典型用例?

2023-12-26

我最近几次遇到这些术语,但我很困惑它们如何工作以及通常何时实施?


嗯,这样想吧。

如果您使用数组(一种简单的基于索引的数据结构),并用随机的东西填充它,那么当您用数据填充它时,查找特定条目将变得越来越昂贵,因为您基本上必须从一端朝向另一端,直到找到您想要的为止。

如果您想更快地访问数据,通常会求助于对数组进行排序并使用二分搜索。然而,这虽然提高了查找现有值的速度,但会导致插入新值的速度变慢,因为当您需要在中间插入元素时,您需要移动现有元素。

另一方面,哈希表有一个关联的函数,它接受一个条目,并将其简化为一个数字,即哈希键。然后,该数字将用作数组的索引,这就是存储条目的位置。

哈希表围绕一个数组,该数组最初是空的。空并不意味着长度为零,数组以一个大小开始,但数组中的所有元素都不包含任何内容。

每个元素都有两个属性:数据和标识数据的键。例如,美国邮政编码列表将是邮政编码 -> 名称关联类型。该函数减少了键,但不考虑数据。

因此,当您将某些内容插入哈希表时,该函数会将键减少为一个数字,该数字用作此(空)数组的索引,这就是您存储数据(包括键和关联数据)的位置。

然后,稍后,您想要找到您知道其密钥的特定条目,因此您通过相同的函数运行该密钥,获取其哈希密钥,然后转到哈希表中的该特定位置并检索那里的数据。

从理论上讲,将密钥减少为散列密钥(即该数字)的函数在计算上比线性搜索便宜得多。

典型的哈希表没有无限数量的可用于存储的元素,因此该数量通常会进一步减少到适合数组大小的索引。实现此目的的一种方法是简单地取索引与数组大小的模数。对于大小为 10 的数组,索引 0-9 将直接映射到下一个索引,索引 10-19 将再次向下映射到 0-9,依此类推。

某些键将被缩减为与哈希表中现有条目相同的索引。此时,将直接比较实际的键,并使用与比较键的数据类型相关的所有规则(例如,正常的字符串比较)。如果存在完全匹配,您要么忽略新数据(它已经存在),要么覆盖(替换该键的旧数据),要么添加它(多值哈希表)。如果没有匹配,这意味着虽然散列键相同,但实际键不同,您通常会找到一个新位置来存储该键+数据。

冲突解决有多种实现方式,最简单的一种是直接转到数组中的下一个空元素。但这个简单的解决方案还有其他问题,因此找到正确的解析算法对于哈希表来说也是一个很好的练习。

如果哈希表完全填满(或接近填满),哈希表也可以增长,这通常是通过创建新大小的新数组,并再次计算所有索引,并将项目放入新数组中的新数组来完成的。地点。

将密钥减少为数字的函数不会产生线性值,即。 “AAA”变为 1,然后“AAB”变为 2,因此哈希表不按任何典型值排序。

维基百科上也有一篇关于这个主题的很好的文章,here http://en.wikipedia.org/wiki/Hashtable.

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

什么是哈希表和哈希图及其典型用例? 的相关文章

  • c++ pthread - 如何使地图访问线程安全?

    我有一个映射作为成员变量和多个访问该映射的线程 读写访问 现在我必须确保只有一个线程可以访问该地图 但我该如何点呢 最好的解决方案是什么 Boost 包含一些用于共享访问的很好的锁实现 看看文档 http www boost org doc
  • 正则表达式:忽略大小写

    如何使以下正则表达式忽略大小写 它应该匹配所有正确的字符 但忽略它们是小写还是大写 G a b 假设你想要whole正则表达式忽略大小写 你应该寻找i flag http www regular expressions info modif
  • 从哈希表中删除一个值的成本是多少?

    现在我有一个问题 当我们在插入过程中使用线性探测时 有人问我从哈希表中删除值的成本 通过阅读互联网上的各种内容 我发现它必须与负载因子有关 虽然我不确定 但我读到了负载因数与所需探头数量之间的关系 探头数量 1 1 LF 所以我相信成本必须
  • 如何使用 Trie 进行拼写检查

    我有一个根据单词词典构建的特里树 我想用它来进行拼写检查 并建议字典中最接近的匹配项 也许对于给定数量的编辑x 我想我会在目标单词和字典中的单词之间使用 levenshtein 距离 但是有没有一种聪明的方法可以遍历 trie 而不需要对每
  • 如何将数据存储在对象的对象列表中?

    我有以下代码 将年龄相同且得分最高的用户分组 我现在有而不是Map
  • 导致堆栈溢出的最短代码是什么? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何将 HashMap> 存储在列表中?

    我的哈希图将字符串存储为键 将数组列表存储为值 现在 我需要将其嵌入到列表中 也就是说 它将采用以下形式 List
  • Java HashMap - 深拷贝

    我只是想找出如何进行深层复制的最佳解决方案HashMap 该映射中没有对象实现Cloneable 我想找到比序列化和反序列化更好的解决方案 看一眼深度克隆 在 Google Code 上您可以找到一个库 你可以阅读它https github
  • Java - 线程“主”中的异常 java.util.ConcurrentModificationException

    有什么办法可以修改HashMap迭代特定键时的值 下面给出一个示例程序 public static void main String args HashMap
  • 使用 get/post 的免费云数据存储? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我知道还有其他类似的键 值存储http openkeyval org http openkeyval o
  • 初始化 HashMap 的最佳方法

    我通常会这样做 HashMap
  • 需要帮助解决 Project Euler 问题 200 [已关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在尝试制定一个算法来解决 We
  • 类是否应该有静态和非静态成员

    我试图找出一个类何时适合同时具有静态和非静态函数 又名 obj new ClassA obj gt doOOPStuff something ClassA doStaticStuff Note This example is done in
  • Delphi 5 的哈希表实现 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 您知道 Delphi 5 的良好且免费的哈希表实现吗 我需要在哈希表中组织大量数据 并且我有点担心在网
  • 快速约会算法

    我在一家咨询公司工作 大部分时间都在客户所在地 正因为如此 我很少见到同事 为了更好地了解彼此 我们将安排一个晚宴 会有很多小桌子 方便人们聊天 为了在聚会期间与尽可能多的不同的人交谈 每个人都必须每隔一段时间 比如每小时 换一张桌子 如何
  • JSON 中的哈希到底是什么?

    我正在学习 JSON 但我发现你也可以将所谓的 哈希 放入 JSON 中 我在哪里可以找到什么是哈希 或者你能向我解释一下什么是哈希吗 另外 什么是哈希图 我有 C 和 C 经验 正在学习 JS Jquery 和 JSON 哈希是一个稀疏数
  • 验证假名输入

    我正在开发一个允许用户输入日语字符的应用程序 我试图想出一种方法来确定用户的输入是否是日语假名 平假名 片假名或汉字 应用程序中的某些字段不适合输入拉丁文文本 我需要一种方法将某些字段限制为仅限汉字或仅限片假名等 该项目使用UTF 8编码
  • 如何在出现“无法解析放置符号”错误时向哈希图添加键和值

    我正在与安卓工作室 https en wikipedia org wiki Android Studio1 4 1 我刚刚创建了一个 Hashmap 并正在遵循有关如何填充和操作它的教程 Java 语言 但是 我收到 无法解析符号放置 错误
  • 负整数的基数排序

    我正在尝试对整数 包括负整数 实现基数排序 对于非负整数 我计划为数字0 9创建一个10个队列的队列 并实现LSD算法 但我对负整数有点困惑 我现在的想法是继续为它们创建另一个包含 10 个队列的队列 并分别对它们进行排序 然后在最后 我将
  • Java中HashMap和ArrayList的区别?

    在爪哇 ArrayList and HashMap被用作集合 但我不明白我们应该在哪些情况下使用ArrayList以及使用时间HashMap 他们两者之间的主要区别是什么 您具体询问的是 ArrayList 和 HashMap 但我认为要完

随机推荐