繁体   English   中英

HashMap || 哈希码查找如何保持恒定

[英]HashMap || How hashcode lookup is constant

在哈希图中,哈希码查找如何为常数O(1)

我们知道,哈希表在内部会创建一个数组来保存给定键值的哈希码。 通过使用散列函数,hashmap生成散列代码。 我们还知道,对于查找来说,哈希图需要花费恒定的时间(假设没有冲突)。 每当我们请求哈希映射以查找给定键的值时,它首先会计算存储桶位置(即与给定键的哈希码映射的数组的索引)。 然后,它获取值。 我知道第二部分将花费固定的时间。 但是第一部分呢? 哈希码的数组索引查找常量如何? 特别是当哈希图具有数百万个值时?

我的StackOverflow搜索在哈希图上发现了多个问题,但大多数情况下,它们回答了我问题的第二部分,而不是第一部分。

我发现的链接很少:

  1. 为什么哈希表查找为O(1)即恒定时间?
  2. 哈希表真的可以是O(1)

我还发现了用户在javarevisited.blogspot上发布的这个问题:

嗨,Javin,您需要澄清我最近一次面试的问题之一。 为了搜索和排序首选哪个Collection数据结构:ArrayList或LinkedList。 我提到ArrayList是实现随机访问的检索操作的选择,而链表则是插入/删除的更好选择,因为它保留了节点之前和之后的指针。 我的后续问题,那么您是说使用拥有100万条记录的Arraylist来加快检索速度吗? 我说过,如果索引已知,我们可以使用contains()并获取值。 但是请在真实的动态情况下(即不知道索引)对此100万个场景进行说明。 ArrayList会更快吗?

您似乎对数据结构有误解。 创建阵列时,该阵列将在内存中保存一个空间。 该空间的大小是数组中元素的数量乘以每个元素大小

因此,包含八个2字节数字的数组将为16字节。

可以说我们想要第四个索引处的数字:我们无需迭代即可查找该数字因为我们对数据结构的性质有所了解:特别是它的起始位置和每个元素的大小。 在这种情况下,我们知道如果将2个字节乘以3(3 = 4-1:记住我们是零索引的),我们将得到6,而想要的元素的起始位置要比数组的起始位置晚6个字节。

Hashmap通常由这种性质的数组作为后盾。 所需数组元素的起始位置的计算较为复杂,但无需迭代即可完成。 因此它是O(1) 在数组位置找到的是所检索在内存中的实际位置。

  • 使用提供的键来计算后备阵列中位置(存储值的存储位置)的功能是恒定时间操作。
  • 读取第一步中计算出的存储位置是恒定时间操作。
  • 读取存储在第二步中读取的位置中的存储位置是恒定时间操作。

因此,整个操作在恒定时间内进行。

给定索引的数组查找是在恒定时间内完成的。 实际上,这是一个简单的地址计算(基址+索引*跨度),然后是间接寻址。

当您找到哈希码时,您也可以找到恒定时间的单元格编号

cellIndex = hash(X) % array.length

所以你完全有const时间

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM