HashMap ||哈希码查找的常量如何

时间:2015-12-05 20:40:47

标签: java algorithm hash hashmap

在hashmap中,hashcode如何查找常量O(1)

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

我的StackOverflow搜索在hashmap上发现了多个问题,但大部分是他们回答了我的问题的第二部分而不是第一部分。

我找到的链接很少:

  1. Why hashmap lookup is O(1) i.e. constant time?
  2. Can hash tables really be O(1)
  3. 我还发现用户在javarevisited.blogspot发布了此问题:

      

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

3 个答案:

答案 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

所以你有时间