[英]HashMap || How hashcode lookup is constant
在哈希图中,哈希码查找如何为常数O(1)
?
我们知道,哈希表在内部会创建一个数组来保存给定键值的哈希码。 通过使用散列函数,hashmap生成散列代码。 我们还知道,对于查找来说,哈希图需要花费恒定的时间(假设没有冲突)。 每当我们请求哈希映射以查找给定键的值时,它首先会计算存储桶位置(即与给定键的哈希码映射的数组的索引)。 然后,它获取值。 我知道第二部分将花费固定的时间。 但是第一部分呢? 哈希码的数组索引查找常量如何? 特别是当哈希图具有数百万个值时?
我的StackOverflow搜索在哈希图上发现了多个问题,但大多数情况下,它们回答了我问题的第二部分,而不是第一部分。
我发现的链接很少:
我还发现了用户在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.