Language agnostic 什么是哈希表和哈希映射及其典型用例?

Language agnostic 什么是哈希表和哈希映射及其典型用例?,language-agnostic,hashtable,hashmap,Language Agnostic,Hashtable,Hashmap,我最近几次碰到这些术语,但我很困惑它们是如何工作的,以及通常在什么时候实现的?好吧,这样想吧 如果你使用一个数组,一个简单的基于索引的数据结构,并用随机的东西填充它,那么在填充数据时查找一个特定的条目将是一个越来越昂贵的操作,因为你基本上必须开始从一端向另一端搜索,直到找到你想要的条目为止 如果您想更快地访问数据,可以对数组进行排序并使用二进制搜索。然而,当增加查找现有值的速度时,会使新值慢插入,因为需要在中间插入元素时需要移动现有元素。 另一方面,哈希表有一个关联函数,该函数接受一个条目,并将

我最近几次碰到这些术语,但我很困惑它们是如何工作的,以及通常在什么时候实现的?

好吧,这样想吧

如果你使用一个数组,一个简单的基于索引的数据结构,并用随机的东西填充它,那么在填充数据时查找一个特定的条目将是一个越来越昂贵的操作,因为你基本上必须开始从一端向另一端搜索,直到找到你想要的条目为止

如果您想更快地访问数据,可以对数组进行排序并使用二进制搜索。然而,当增加查找现有值的速度时,会使新值慢插入,因为需要在中间插入元素时需要移动现有元素。

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

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

每个元素都有两个属性,数据和一个标识数据的键。例如,美国的邮政编码列表将是邮政编码->名称类型的关联。函数减少了密钥,但不考虑数据。 因此,当您在哈希表中插入一些内容时,函数将键减少为一个数字,该数字用作此(空)数组的索引,这是存储数据的地方,包括键和关联数据

然后,稍后,您希望找到一个特定的条目,您知道该条目的键,因此您可以通过相同的函数运行该键,获取其哈希键,然后转到哈希表中的特定位置并在那里检索数据

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

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

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

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

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

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


wikipedia也有一篇关于这个主题的好文章。

哈希表/哈希映射将一个值(为了消除歧义称为“key”)与另一个值相关联。您可以将它们视为一种字典(单词:定义)或数据库记录(关键字:数据)。

如果您是用Java的术语来说的话,它们都是允许对象添加、删除和更新的集合,并在内部使用Hasing算法

然而,如果我们参考Java来讨论的话,显著的区别在于哈希表本质上是同步的,因此是线程安全的,而哈希映射不是线程安全的集合

除了同步之外,在这两种情况下,存储和检索对象的内部机制都是散列


如果您需要了解散列是如何工作的,我建议您在Google上搜索一下数据结构和散列技术。

lassevk的答案很好,但可能包含了太多的细节。这是执行摘要。我故意省略了某些相关的信息,你可以安全地忽略99%的时间

在99%的时间里,哈希表和哈希映射之间没有重要的差别

哈希表很神奇 真的。这是一个神奇的数据结构,除了之外,它保证了三件事。(当然也有例外。你基本上可以忽略它们,尽管有一天学习它们可能会对你有用。)

1) 哈希表中的所有内容都是一对的一部分——有一个键和一个值。您可以通过指定正在操作的密钥来输入和输出数据

2) 如果您通过哈希表上的一个键执行任何操作,它的速度会非常快。这意味着
put(key,value)
get(key)
contains(key)
,以及
remove(key)
都非常快

3) 通用哈希表无法执行#2中未列出的任何操作!(所谓“失败”,我们的意思是他们的速度非常慢。)

我们什么时候使用哈希表? 当哈希表的魔力适合我们的问题时,我们使用哈希表。

例如,