什么是编程中的哈希映射以及它可以在哪里使用
Posted
技术标签:
【中文标题】什么是编程中的哈希映射以及它可以在哪里使用【英文标题】:What is a hash map in programming and where can it be used 【发布时间】:2011-02-05 05:30:27 【问题描述】:我经常听到人们谈论散列、散列映射和散列表。我想知道它们是什么以及你可以在哪里最好地使用它们。
【问题讨论】:
【参考方案1】:基本上,HashMap 允许您存储带有标识符的项目。它们以表格格式存储,标识符使用散列算法进行散列。
通常,它们检索项目比搜索树等更有效。
您可能会觉得这很有帮助:http://www.relisoft.com/book/lang/pointer/8hash.html
希望对你有帮助,
克里斯
【讨论】:
【参考方案2】:首先你应该阅读这个article。
当您使用列表并且您正在寻找一个特殊项目时,您通常必须遍历整个列表。当您有大量列表时,这非常昂贵。
哈希表可以更快,在最好的情况下,您只需一次访问即可获得所需的项目。
它是如何工作的?就像字典一样……当您在字典中查找单词“hashtable”时,您不是从“a”下的第一个单词开始的。而是直接前进到字母“h”。然后到'ha','has'等等,直到你找到你的词。您正在使用字典中的索引来加快搜索速度。
哈希表的作用基本相同。每个项目都有一个唯一的索引(所谓的hash
)。您使用此哈希进行查找。散列可以是普通链表中的索引。例如,您的哈希可能是一个像 2130 这样的数字,这意味着您应该查看列表中的位置 2130。在普通列表中查找已知索引非常简单快捷。
整个方法的问题是所谓的hash function
,它将这个索引分配给每个项目。当您在寻找一个项目时,您应该能够提前计算索引。就像在真正的字典中一样,您会看到“hashtable”这个词以字母“h”开头,因此您知道大概的位置。
一个好的散列函数可以提供均匀分布在所有可能散列码空间上的散列码。当然,它会尽量避免collisions
。当两个不同的项目获得相同的哈希码时,就会发生冲突。
例如,在 C# 中,每个对象都有一个 GetHashcode()
方法,该方法为其提供哈希(不一定是唯一的)。这可用于在您的字典中查找和排序。
当您开始使用哈希表时,您应该始终牢记正确处理冲突。在大型哈希表中很容易发生两个对象具有相同哈希的情况(可能您的 GetHashcode() 重载有问题,也可能发生了其他事情)。
【讨论】:
一个很好解释的答案 “你(应该)正确处理碰撞”是什么意思?据我所知,我们应该尽量通过编写好的散列函数来尽量减少冲突(以获得更好的性能)。但是,没有必要“处理冲突”。如果哈希值发生冲突,它将通过相等比较进行下一级检查。 @Teddy:散列函数只是做散列。没有“下一级”。这就是我所说的“注意碰撞”的意思。当有多个匹配项时,您必须选择例如平等比较。 @tanascius 我的意思是内置集合 HashMap 使用 hashCode 函数作为第一级检查。如果两个项目具有相同的hashCode,则HashMap将进行下一级检查,即equals检查。所以,我们的工作就是为我们的自定义对象编写一个体面的 hashCode 实现。 @Teddy HashMap 是 Java 特有的,我不知道确切的行为。但总体而言,这个问题并不是 Java 特有的。但你是对的,某些实现可能会有所不同,并且已经内置了下一级检查。【参考方案3】:散列(在非密码学意义上)是一个笼统的术语,用于获取输入然后产生输出以识别它。散列的一个简单示例是将字符串的字母相加,即:
f(abc) = 6
请注意,这种简单的散列方案会在字符串 abc、bca、ae 等之间产生冲突。有效的散列方案自然会为每个字符串生成不同的值。
哈希图和哈希表是数据结构(如数组和列表),它们使用哈希来存储数据。在哈希表中,会生成一个哈希(从提供的键或从对象本身)确定对象在表中的存储位置。这意味着只要哈希表的用户知道密钥,检索对象就非常快。
相比之下,在列表中,您需要以某种方式在列表中进行搜索才能找到您所寻找的对象。这也代表了哈希表的背面,即在不知道键的情况下在其中查找对象非常复杂,因为对象存储在表中的位置与其值无关,也与输入时间无关。
Hashmaps 类似于 hashtables,但每个对象只存储一个示例(因此不需要提供 key,对象本身就是 key)。
这当然是一个非常简单的解释,所以我建议你从这里开始深入阅读。我希望我没有犯任何愚蠢的错误。 =)
【讨论】:
【参考方案4】:Hashmap 用于在键值对中存储数据。我们可以使用 hashmap 在应用程序中存储对象,并在同一个应用程序中进一步使用它来存储、更新、删除值。 Hashmap 的键和值存储在一个桶中到一个特定的条目,这个条目的位置是使用 Hashcode 函数确定的。此哈希码函数确定存储值的哈希值。这段视频详细介绍了 hashmap 的工作原理:https://youtu.be/iqYC1odZSNo
【讨论】:
【参考方案5】:与其他搜索条件相比,哈希映射节省了大量时间。我们有一个对应于哈希码的哈希键,这进一步有助于找到它的索引值。在实现方面,哈希映射将字符串转换为整数并重新映射以将其转换为数组的索引,这有助于找到所需的值。
更详细地说,我们可以在哈希映射中寻找处理冲突。就像我们可以使用链表来代替数组一样。
有一个简短的视频可以理解它。 在这里可用: 实现示例 --> https://www.youtube.com/watch?v=shs0KM3wKv8
示例: int hashCode(String s) 逻辑
【讨论】:
以上是关于什么是编程中的哈希映射以及它可以在哪里使用的主要内容,如果未能解决你的问题,请参考以下文章