考虑一个int数组变量x []。变量X将具有起始地址引用。当索引2为x [2]访问数组时,然后将其内存位置计算为
x [2]的地址是int的起始地址+索引*大小。
即。 x [2] = x + 2 * 4.
但是在hashmap的情况下如何在内部映射内存地址。
通过阅读许多以前的帖子,我发现HashMap使用链表来存储键值列表。但如果是这种情况,那么为了找到一个密钥,它会生成一个哈希码,然后它将检查列表中的相等哈希码并检索该值。
这需要O(n)复杂度。 如果我在上述观察中出错了请纠正我...我是初学者。 谢谢
答案 0 :(得分:2)
HashMap的传统实现是使用函数生成密钥,然后使用该密钥直接访问值。将其视为生成将转换为数组索引的内容。它不会查看将元素哈希值与生成的哈希值进行比较的哈希值;它生成哈希,并使用哈希直接访问元素。
我认为你在谈论的是HashMap中的两个值生成SAME密钥的情况。然后它使用那些列表,并且必须通过它们来确定它想要的那个。但这不是O(n),其中n是HashMap中元素的数量,只是O(m),其中m是具有相同散列的元素的数量。显然,游戏的名称是找到一个哈希函数,其中生成的哈希对于所有元素都是唯一的,尽可能多。
---编辑以扩展解释---
在你的帖子中,你说:
通过阅读许多以前的帖子,我发现HashMap使用链接 用于存储键值列表的列表。
这对整个HashMap来说是错误的。为了使HashMap合理地工作,必须有一种方法来使用密钥来计算直接访问相应元素的方法,而不是通过搜索HashMap中的所有值。
“完美”哈希计算会将每个可能的密钥转换为未针对任何其他密钥计算的哈希值。这通常是不可行的,因此通常可能两个不同的密钥将导致哈希计算的相同结果。在这种情况下,HashMap实现可以使用链接的值列表,并且需要查看所有这些值以找到它正在查找的值。但是这个数字的FAR小于整个HashMap中的值的数量。
您可以创建一个以字符串为键的哈希值,并将字符串的第一个字符转换为一个数字,然后将其用作数组索引。只要你的字符串都有不同的第一个字符,那么访问该值就是一个简单的计算加上一个数组访问--O(1)。或者你可以将字符串索引的所有字符值加在一起并取最后两(或三)个数字,那就是你的哈希计算。只要添加为每个索引字符串生成唯一值,您就不必查看列表; O(1)。
事实上,只要散列计算近乎完美,查找总体上仍为O(1),因为您必须查看短列表的次数有限并不会改变整体效率。 / p>