0

考虑一个 int 数组变量 x[]。变量 X 将具有起始地址引用。当使用索引 2 即 x[2] 访问数组时,其内存位置计算为

x[2] 的地址是 int 的起始地址 + 索引 * 大小。

IE。x[2]=x + 2*4。

但是在 hashmap 的情况下,内存地址将如何在内部映射。

通过阅读许多以前的帖子,我观察到 HashMap 使用链表来存储键值列表。但如果是这种情况,那么为了找到一个键,它会生成一个哈希码,然后它会检查列表中是否相等的哈希码并检索值..

这需要 O(n) 复杂度。如果我在上述观察中错了请纠正我......我是初学者。谢谢

4

1 回答 1

2

HashMap 的传统实现是使用一个函数生成一个键,然后使用该键直接访问一个值。将其视为生成将转换为数组索引的内容。它不会通过 hashmap 比较元素散列和生成的散列;它生成散列,并使用散列直接访问元素。

我认为您在谈论的是 HashMap 中的两个值生成相同键的情况。然后它使用这些列表,并且必须查看它们以确定它想要哪个。但这不是 O(n),其中 n 是 HashMap 中的元素数,只是 O(m),其中 m 是具有相同散列的元素数。显然,游戏的名称是找到一个散列函数,其中生成的散列对于所有元素都是唯一的,尽可能多。

--- 编辑以扩展解释 ---

在您的帖子中,您说:

通过阅读许多以前的帖子,我观察到 HashMap 使用链表来存储键值列表。

这对于整个 HashMap 来说是错误的。为了让HashMap合理工作,必须有一种方法可以使用键计算直接访问相应元素的方法,而不是通过搜索HashMap中的所有值。

“完美”的哈希计算会将每个可能的键转换为未针对任何其他键计算的哈希值。这通常是不可行的,因此两个不同的键通常可能会导致哈希计算的相同结果。在这种情况下,HashMap 实现可以使用值的链接列表,并且需要查看所有这些值以找到它正在寻找的值。但是这个数字远小于整个 HashMap 中的值的数量。

您可以创建一个哈希,其中字符串是键,其中字符串的第一个字符被转换为一个数字,然后用作数组索引。只要您的字符串都有不同的第一个字符,那么访问该值就是一个简单的计算加上一个数组访问——O(1)。或者您可以将字符串索引的所有字符值加在一起并取最后两位(或三位)数字,这将是您的哈希计算。只要添加为每个索引字符串生成唯一值,您就不必查看列表;再次,O(1)。

而且,事实上,只要哈希计算近似完美,查找总体上仍然是 O(1),因为您必须查看短列表的有限次数不会改变整体效率。

于 2013-10-17T11:26:49.963 回答