我很难理解哈希表中的概念

时间:2014-02-27 16:32:04

标签: hash language-agnostic hashmap hashtable

我理解哈希表的吸引力在于您获得了O(1)查找时间,但我很难理解存储组件的工作方式。

我理解哈希表使用键值对,给定某个键可以获得其特定值。所以,如果我想将一个名字和一个电话号码联系起来,我可以选择" Paul"作为密钥,电话号码作为我接收的价值。我明白了很多。

  • 所以它在数组索引中的作用是" Paul"得到哈希(比如,3),那个值会有一个电话号码,因此是O(1)查询时间?
  • 我知道碰撞是哈希表的祸根,似乎最流行的方法是在每个条目上放置一个链表而不是原始值,但是当查看值时,它是如何工作的?如果只有一个值,我基本上可以说"给我那个指数的价值"但如果有多个电话号码存储在"保罗的散列索引中,我怎么知道哪一个实际上是Paul?

2 个答案:

答案 0 :(得分:1)

  

如果在“保罗”的散列索引中存储了多个电话号码,我怎么知道哪一个实际上是保罗的?

通常,在此之后,将逐个检查每个条目的相等性,与在链接列表中进行常规搜索的方式相同。

  

那么它的工作原理是在“Paul”被散列到(例如3)的数组索引处,那里的值会有一个电话号码,因此是O(1)查找时间吗?

差不多!散列值通常首先以某种方式转换为桶号,因为散列结果可能超过查找表的合理大小(例如40亿)。

答案 1 :(得分:0)

  

如果在“保罗”的散列索引中存储了多个电话号码,那该怎么办   我知道哪一个实际上是保罗的吗?

存储在哈希表桶中的项目包括多于电话号码(值)。哈希表存储 值。

  

因此,它在“保罗”被散列到的数组索引处起作用   (比方说,3),该值会有一个电话号码,因此O(1)查找   时间?

是的,当“Paul”被哈希到“3”时,通常hash_table [3]中的项目名称为“Paul” Paul的电话号码 - - 通常没有碰撞。 但偶尔会发生碰撞, 并且hash_table [3]中的第一项存储了一些其他名称。 不同哈希表算法之间的主要区别在于它们如何处理冲突(它们的"collision resolution strategy"),其中lookup("Paul")函数下一步显示保罗的姓名和电话号码。