【发布时间】:2016-03-10 16:47:58
【问题描述】:
在哈希图中,哈希码如何查找常量O(1)?
我们知道,hashmap 在内部会创建一个数组来保存给定键值的哈希码。 hashmap利用散列函数生成散列码。我们还知道,对于查找,hashmap 需要恒定的时间(假设没有冲突)。每当我们请求哈希映射来查找给定键的值时,它首先计算存储桶位置(即与给定键的哈希码映射的数组的索引)。然后它获取值。我知道第二部分将花费恒定的时间。但是第一部分呢?如何查找哈希码常量的数组索引?尤其是当哈希图有数百万个值时?
我的 StackOverflow 搜索在 hashmap 上发现了多个问题,但他们大多回答了我问题的第二部分,而不是第一部分。
我找到的链接很少:
我还发现了javarevisited.blogspot的用户发布的这个问题:
嗨,贾文, 需要澄清我最近的一个面试问题。 用于搜索和排序更喜欢的 Collection 数据结构:ArrayList 或 LinkedList。 我提到 ArrayList 将是检索操作的选择,因为它实现了随机访问,而链表将是插入/删除的更好选择,因为它保存了节点前后的指针。 我的后续问题,所以您的意思是说使用包含 100 万条记录的 Arraylist 进行检索更快?我说如果索引已知,我们可以使用 contains() 并获取值。但请在真实动态案例中澄清这 100 万个场景,即在不知道索引的情况下。 ArrayList 会更快吗?
【问题讨论】:
-
big-O 时间的全部意义在于描述算法如何在理想机器上针对
n的大值进行扩展。你能澄清一下你的问题是什么吗? -
"即使它真正的价值更低" ???
-
感谢彼得的回复。我的主要问题是哈希码查找(获取存储桶位置的第一部分)如何保持恒定时间。
-
@ Yves Daoust,假设哈希映射仅包含 10 个值,那么它可以。我想了解对于非常大的 hahmap,hashcode 值的查找是如何保持不变的。
-
不,一点也不,我只是想弄清楚你还需要什么信息。对我来说,其他问题的答案似乎相当清楚。我不明白为什么您认为如果“使用”更多内存位置,内存查找需要更长的时间。你说“显然”,但实际上并非如此。
标签: java algorithm hash hashmap