HashMap(或)HashTable是键控数组的示例。这里,索引是用户定义的键而不是通常的索引号。例如,arr["first"]=99
是一个散列图的示例,其中theb键是第一个,值为99.
由于使用了密钥,因此需要使用散列函数将密钥转换为索引元素,然后在数组中插入/搜索数据。此过程假定无冲突。
现在,给定要在数组中搜索的密钥,如果存在,则必须提取数据。因此,每次在搜索之前必须将密钥转换为数组的索引号。那么如何花费O(1)时间呢?因为,时间复杂度也取决于散列函数。所以时间复杂度必须是O(散列函数的时间)。
答案 0 :(得分:2)
在谈论散列时,我们通常会通过讨论在搜索表中的元素时需要进行的探测的预期数量来衡量散列表的性能。在大多数散列设置中,我们可以证明预期的探测数量是O(1)。通常,我们然后从那里跳到“所以哈希表查找的预期运行时间是O(1)。”
但情况并非如此。正如您所指出的,在特定输入上计算散列函数的成本可能并不总是花费时间O(1)。类似地,比较哈希表中的两个元素的成本也可能不花费时间O(1)。例如,考虑散列字符串或列表。
那就是说,通常情况如下。如果我们让表中的元素总数为n,我们可以说执行查找哈希表的预期成本与数量n无关。也就是说,哈希表中是否有1,000,000个元素或者10 100 并不重要 - 您需要证明的点数平均相同。因此,我们可以说在哈希表中执行查找的预期成本是哈希表大小的函数,是O(1),因为执行查找的成本不依赖于在桌子上。
考虑哈希表中查找成本的最好方法可能就是说它是O(T hash + T eq ),其中T hash 是散列元素所需的时间,T eq 是比较表中两个元素所需的时间。例如,对于字符串,您可以说查找的预期成本是O(L + L max ),其中L是您要散列的字符串的长度,L max 是存储在哈希表中的最长字符串的长度。
希望这有帮助!