在hashmap中,hashcode如何查找常量O(1)
?
我们知道,在内部,hashmap会创建一个数组来保存给定键值的哈希码。通过使用散列函数,hashmap生成散列码。我们也知道,对于查找,hashmap需要恒定的时间(假设没有冲突)。每当我们请求散列映射来查找给定密钥的值时,它首先计算桶位置(即,使用给定密钥的散列码映射的数组的索引)。然后它获取值。我理解第二部分将花费不变的时间。但是第一部分呢?哈希码的数组索引的查找是如何常量的?特别是当hashmap有数百万个值时?
我的StackOverflow搜索在hashmap上发现了多个问题,但大部分是他们回答了我的问题的第二部分而不是第一部分。
我找到的链接很少:
我还发现用户在javarevisited.blogspot发布了此问题:
嗨Javin, 需要澄清我最近的一个面试问题。 用于搜索和排序要优选的Collection数据结构:ArrayList或LinkedList。 我提到ArrayList是检索操作的选择,因为它实现了随机访问,而链表是插入/删除的更好选择,因为它保存了节点前后的指针。 我的后续问题,你是说使用拥有100万条记录的Arraylist来更快地检索?我说如果索引已知,我们可以使用contains()并获取值。但在实际动态情况下,即在不知道索引的情况下,澄清这个100万场景。 ArrayList会更快吗?
答案 0 :(得分:1)
您似乎对数据结构存在误解。创建数组时,该数组的内存空间已保存。该空格的大小是数组中元素的数量乘以每个元素的尺寸。
因此,一个包含8个2字节数字的数组将是16个字节。
让我们说我们想要第四个索引处的数字:我们可以在没有迭代的情况下查找这个数字 因为我们对数据结构的本质有所了解:特别是它的起始位置和每个的大小元件。在这种情况下,我们知道如果我们将2个字节乘以3(3 = 4 - 1:记住我们是零索引),我们得到6并且我们想要的元素的开始是超过数组开头的6个字节。 / p>
Hashmaps通常由这种性质的数组支持。所需数组元素启动位置的计算更复杂,但可以在没有迭代的情况下完成 。因此它是O(1)
。在数组位置中找到的值是检索到的值在内存中的实际位置。
因此,整个操作在固定的时间内发生。
答案 1 :(得分:0)
给定索引处的数组查找是在恒定时间内完成的。实际上,它是一个简单的地址计算(base + index * stride),后跟间接。
答案 2 :(得分:0)
当您找到哈希码时,您也可以找到恒定时间的单元格编号
cellIndex = hash(X) % array.length
所以你有时间