使用List或Array作为Hashmap中的键时的运行时是什么

时间:2014-09-26 23:57:40

标签: java arrays list hashmap hashcode

散列映射将在O(1)时间内返回值。这就是我们使用它的原因。

但是比较两个数组或列表应该在O(N)时间内发生,其中N是这些列表的长度,因为我们需要查找N个元素进行比较。

当我们使用列表/数组作为Hashmap的键时会发生什么。 hashmap索引是否弥补了比较列表的低效率?或者哈希码函数现在是否在O(M)时间内运行(M是用作键的列表的长度)。

如果它确实在O(M)中运行,我怀疑,当你需要按键列表而不是单个键映射值时,有什么更好的方法?

感谢您的任何意见!

2 个答案:

答案 0 :(得分:0)

好吧,因为每个对象都有它自己的签名,所以映射将基于它构建,并且你的密钥实际上是列表或数组的面并不重要。然后时间约为O(1)。 因此,如果您能够轻松(并快速)检索列表,那么您所建议的是一种很好的方法。

一些额外的: 哈希映射的工作方式是它具有一些函数 - 哈希函数,可以根据您的对象ID(您的密钥)自动或手动构建,对于每个不同的对象,它应该为您提供一个数字。这个数字已经解决了你的价值。像这样,您可以使用特定密钥或多或少地对O(1)搜索您的值。

答案 1 :(得分:0)

假设您正在使用HashMap<ArrayList<K>,V>之类的内容:以下是它的工作原理。

将(键,值)对添加到列表时,它会计算键的哈希码。使用查看列表中所有元素的哈希码的公式计算ArrayList的哈希码。因此,如果你有两个ArrayList s元素相等(即元素上的equals()方法返回true,这意味着hashCode()方法必须返回相同的值),{{ 1}} s将返回相同的ArrayList。然后将此哈希代码转换为哈希数组的索引,该哈希数组标识一个哈希 bucket ,并将密钥添加到存储桶的密钥列表中。 (理想情况下,哈希表应该足够大,以便这些键列表的长度通常不超过1。)

当您搜索密钥时,hashCode会计算密钥的哈希码。如上所述,这会查看列表的每个元素,因此是O(N),其中N是列表的长度。这再次转换为标识一个哈希桶的索引。这个桶有一个键列表。然后将密钥与&#34;桶列表中的每个密钥进行比较&#34; (我需要考虑一个更好的术语)使用HashMap; equals()必须查看两个键的每个元素,这是另一个O(N)。假设它找到了它正在寻找的密钥,它就可以检索该值。您无法在不使用equals()比较密钥的情况下顺利通过,因为两个不等于具有相同哈希码的列表是可能的。

因此哈希查找仍然必须遍历equals()的每个元素才能检查密钥是否相等。您可以通过设置保留正在运行的哈希代码的包装类来使哈希代码计算保持不变,但是通常不可能消除检查每个元素是否相等。如果你能想出一个与1对1对应的哈希函数,那么相等的哈希码意味着相等的列表,那么你可以消除那个O(N)。但总的来说,你不能这样做,除非对列表中的哪种数据有严格的限制。在这种情况下,有可能提出一种方法使ArrayList成为简单的哈希码比较。但它不值得付出努力。如果列表很短,那么O(N)就不用担心了;如果它们很长,那么就不可能想出这样的功能。